API是非常糟糕的(温和地
前几天,我参加了一家公司的黑客马拉松,我决定使用Android摄像头。我总是说AndroidAPI是非常糟糕的(温和地说),但是我从来没有试图明确地说出什么是错误的,以及如何才能更好。直到现在。
所以,了。如果你以前没看过,那就看一看。你可以用很多错误的方式使用它,你可以忘记许多重要的事情,你不容易发
现问题的所在,即使是堆叠溢出,它只是感觉不好。换句话说,API有问题,需要读取10个步骤的列表,其中一些步骤被突出显示为“重要”。你怎么写那个API?让我们改进一下。
所以我做了-我下是我所做的改变和改变的原因:
https://wap.douban.com/note/826289074/
setPreviewDisplay(..)
在此之前是必需的startPreview()
,而在拍照之前,它又是必需的。为什么不强制执行呢?我们只需抛出一个异常“预览显示未设置”,但这还不够好。让我们去掉设置预览显示的方法,然后使startPreview(..)
以表面为参数。使其过载,以便能够采取SurfaceTexture
也是。- 我们已经执行了预览设置,所以现在让我们强制启动预览。我们可以再次抛出“预览未启动”异常。
takePicture(..)
,但这是在运行时发生的。让我们换掉takePicture(..)
方法之外的Camera
类并将其放入CameraActions
班级。连同其他只有在预览启动后才有效的方法(我不知道它们到底是哪些--从当前的API中还不清楚)。如何获得CameraActions
举个例子?它由startPreview(..)
- 到目前为止我行正确的一组步骤,可以减少直接和较少的错误发生。但
takePicture(..)
方法还是觉得很奇怪。您可以向所有参数提供空值,但不知何故有两个重载方法。可以说,传递NULL是可以的,但是还有其他选项。一个是介绍一个PictureCallback
接口,该接口具有所有可调用的四个方法,并在BasePictureCallback
班级。但是,这在这种情况下可能不适用,因为如果您传递NULL和回调(至少在我的手机上,如果我传递一个快门回调,则播放快门声音,如果我传递NULL,它不是),则会产生不同。那么,让我们介绍一下Callbacks
它是一个类似于构建器的类,它包含所有您喜欢的回调。 - 到目前为止还不错,但是您需要在拍照后重新启动预览。而自动重新启动它可能不是一个好的默认。但在我们所处的情况下,你只有
CameraActions
打电话startPreview(..)
现在需要通过一个表面。我们是不是应该restartPreview()
方法?没有。我们可以使我们的接口方法返回布尔值,如果开发人员想重新启动预览,它们应该只返回。true
。如果没有4次不同的回调,那就好了,而根据所有4次回调计算结果是很棘手的。这就是为什么一个明智的选择是添加一个restartPreview
属性的Callbacks
类,并且只有在上次调用回调之后才重新启动,并且只有在属性设置为true时才重新启动。 - 现在主要的过程已经改进了,但是还有其他的东西需要改进。例如,打开和关闭相机的方法是不对称的。“打开”和“释放”。它应该是“开放”和“关闭”或“获取”和“释放”。我想要一个
.close()
,然后(如果您可以使用Java 7),使用AutoClosable
接口,因此尝试使用资源构造。 - 当你打电话
getParameters()
您可以复制参数。这没什么,但你应该把它们放回原处,这在一开始是违反直觉的。提供一个简单的camera.setParameter(..)
方法将更容易使用,但是Parameters
类有很多方法,所以不能将它们带到Camera
班级。我们可以使参数可变吗?(尚未落实) - API使用起来如此麻烦的原因之一是错误报告。不管是什么原因,你几乎只能得到“Came.takture失败”。通过上述步骤,我们在某些情况下消除了例外情况的需要,但最好能更好地报告确切原因。
- 我们需要让摄像机模拟友所以
EasyCamera
是一个界面,您可以很容易地模拟它。CameraActions
也是一个简单的可模拟类。
我的EasyCamera项目现在只是一个初始版本,还没有在生产代码中使用,但是我想了解它是否比原来的更好,以及如何改进它。在某种程度上,它可以包装其他繁琐的相机功能,如获得前和后相机,等等。
https://bbs.hupu.com/52123540.html
破坏API是数百个小时、金钱和神经元浪费的原因。这就是为什么当您设计API时,您需要一些非常具体的技能,并且需要问自己
https://www.douban.com/note/826289074/
许多问题,我建议你这样做。事实上,我违反了他的一条建议--“如果有疑问,把它忘了”--你可以在你的CameraActions中使用整个摄像头,这样你就可以做一些不起作用的事情了。然而,我没有完全意识到相机的所有功能,这就是为什么我不想限制用户,让他们发明笨拙的解决办法。
当我开始写这篇文章的时候,我并不打算写EasyCamera。但结果花了两个小时,所以我做到了。我建议开发人员,每当遇到糟糕的API时,就做上面的练习--想想他们是如何编写的。然后,与继续使用它相比,实际修复或包装它的努力可能要少得多。