假设我有一个大约有10个字段的应用程序类。在其他一些实用程序类中,我有下面两种方法之一。在这两种方法中,哪一种最好?是传递整个应用程序对象更好,还是只传递实用方法所需的对象更好?请解释原因。
public printUsernameAndGroup(String username, String group){
sout(username);
sout(group);
}
public printUsernameAndGroup(Application application){
sout(application.username);
sout(application.group);
}
在这两种方法中,哪一种最好?是传递整个应用程序对象更好,还是只传递实用方法所需的对象更好?请解释原因。?
根据干净的代码(鲍勃叔叔)。显然,有两个或更多参数的函数比单参数函数更难理解。例如,writeField(name)
比writeField(output Stream,name)
更容易理解。
函数的理想参数数为零(niladic)。接下来是一个(一元),紧接着是两个(二元)。在可能的情况下,应避免三种争论(三元争论)。超过三个(多元酸)需要非常特殊的理由,然后无论如何都不应该使用。
常见的一元形式:将单个参数传递到函数中有两个非常常见的原因。您可能会问一个关于该参数的问题,如在布尔文件存在(“我的文件”)中。或者你可能正在操作那个参数,把它转换成其他东西并返回它。例如,InputStream fileOpen("MyFile")
将文件名String转换为返回值。这两种用法是读者看到一个函数时所期待的。
二元函数:有两个参数的函数比一元函数更难理解。例如,writeField(name)
比writeField(output Stream,name)
更容易理解。虽然两者的意思都很清楚,但第一个从眼睛旁边滑过,很容易就把它的意思储存了下来。第二个需要短暂的停顿,直到我们学会忽略第一个参数。当然,这最终会导致问题,因为我们永远不应该忽略代码的任何部分。我们忽略的部分是漏洞隐藏的地方
当然,有时两种观点是合适的。例如,p点=新点(0,0)
非常合理。笛卡尔点自然有两个论点。事实上,我们会非常惊讶地看到
新的点(0)
。但是,本例中的两个参数是单个值的有序组件!而输出流
和名称
既没有自然的内聚,也没有自然的顺序。
三元组:包含三个参数的函数比二元组更难理解。排序、暂停和忽略的问题增加了一倍多。我建议你在创建三合会之前仔细考虑。
例如,考虑
信息
,认为这是预期的
?我已经多次为这个特殊的三位一体跌跌撞撞地停了下来。事实上,每次我看到它,我都会重复一次,然后学会忽略信息。
参数对象(您要求这样做):当一个函数似乎需要两个或三个以上的参数时,其中一些参数很可能应该包装成自己的类。例如,考虑以下两种声明之间的区别:
Circle makeCircle(double x, double y, double radius);
Circle makeCircle(Point center, double radius);
通过创建对象来减少参数的数量可能看起来像作弊,但事实并非如此。当变量组一起传递时,就像上面例子中的
x
和y
一样,它们可能是一个概念的一部分,应该有自己的名字。
Argumen列表:有时我们希望将数量可变的参数传递给函数。例如,考虑<代码>字符串。格式
方法:
String.format("%s worked %.2f hours.", name, hours);
如果变量参数都像上面的例子一样被同等对待,那么它们就相当于List类型的单个参数。根据这个推理,String。格式实际上是二元的。实际上,
String的声明。如下所示的格式显然是二元的。
public String format(String format, Object... args)
所以所有相同的规则都适用。接受变量参数的函数可以是单元格、双元格,甚至三和弦。但是给他们更多的论据是错误的。
void monad(Integer... args);
void dyad(String name, Integer... args);
void triad(String name, int count, Integer... args);
简而言之,每个系统都是由程序员设计的一种特定于领域的语言构建而成,用来描述该系统。函数是该语言的动词,类是名词。如果你遵循这里的规则,你的功能就会很好,组织得很好。
但永远不要忘记,你真正的目标是讲述系统的故事,你编写的函数需要清晰地组合成一种清晰准确的语言,以帮助你讲述。
如果我有机会修改你的代码,我会修改如下:
//it's already fine:
public printUsernameAndGroup(String username, String group){
sout(username);
sout(group);
}
//I changed printUsernameAndGroup to printUserInformation and Application to User for more readable
public printUserInformation(User user){
sout(user.username);
sout(user.group);
}
但这只是我对你当前代码的建议。对于整个项目的设计和方法,这取决于你,我希望你在这里得到你真正需要知道的。
如果只需要两个值,则只传递两个值。但是如果你需要超过2个字段或者可能是Application对象的全部10个字段,最好传递对象。
还有一件事,如果您正在传递一个应用程序对象,那么您的函数将只处理应用程序对象,而不处理其他对象。但在第一个场景中,可以从不同的对象传递任意两个字符串以使其工作。e、 g.我想你是在打印价值观之类的东西。
关于性能,其中两个是一样的。如果你实现你的功能作为
public printUsernameAndGroup(String username, String group){
sout(username);
sout(group);
}
在调用函数之前,您将访问对象的用户名和组属性。当你把它实现为
public printUsernameAndGroup(Application application){
sout(application.username);
sout(application.group);
}
您只是传递该对象引用的副本,而不是复制所有10个字段,然后再次访问它的两个属性。
但是,如果你考虑到易用性,第二个将更加用户友好。
我对BDD与Cucumber有关的最佳实践有两个疑问。 我有一个页面自动用户注册。 我想能够提交测试通过测试1个选项选择,2个选项,3个选项,...,所有选项几次。但我只想做,如果有一个精干的方法来做这件事。 换句话说:在场景大纲示例中,我可以在这种情况下传递空值吗?
我有一个RESTful Web API项目,我有2个不同的Enum场景,我不确定是最佳实践。 场景1:简单的枚举参数 我的API方法需要一个名为的参数,有效值为和。Web API项目中的枚举如下所示: 我对这个场景的问题是,我应该使用<code>吗?ruleType=EmailAddress(它会自动将该值绑定到API方法中的property)?如果是,如何最好地验证发送的<code>RuleTy
问题内容: 将对象传递给方法后,我想更改其字段之一。在Java中执行此任务的最佳实践是什么? 问题答案: 简单的答案 如其他答案所述,您可以简单地调用setter方法。 更多的哲学答案 通常,在除对象创建范围之外的范围内对对象进行突变可能很危险: http://en.wikipedia.org/wiki/Functional_programming 就是说,在很多情况下,您只想在同一逻辑范围内封装
这里有些给使用和编写 Ansible playbook 的贴士. 你能在我们的 ansible-example repository.找到展示这些最佳实践的 playbook 样例.(注意: 这些示例用的也许不是最新版的中所有特性,但它们仍旧是极佳的参考.) Topics 最佳实践 接下来的章节将向你展示一种组织 playbook 内容方式. 你对 Ansible 的使用应该符合你的需求而不是我们
处理后台任务与常规调用方法有很大的不同。本指南旨在帮助让您的后台任务平稳有效地运行。本文基于 这篇博客文章。 使任务参数小而简单 方法(任务)在调用之前会被序列化。使用 TypeConverter 类将参数转换为 JSON 字符串。如果您有复杂的实体和 / 或大对象; 包括数组,最好将它们放入数据库,然后只将其标识 (id) 传递给后台任务。 错误例子: public void Method(En
VR设计 VR设计不同于平面体验设计。作为一种新的媒介,有新的最佳实践需要遵循,特别是保持用户的舒适性和存在性。这在如下指南中已经写得很透彻了: Oculus VR最佳实践 Leap Motion VR最佳实践指南 一些值得注意的事情: 公共的金科玉律是永远不要意外地把相机控制权从用户手中剥夺。 单位(比如对于位置)应该考虑使用米(m)。这是因为WebVR API以米为单位返回姿势数据,进而传送给