我应该logging我的私人方法吗?
只有谁有权访问源代码才能看到私有方法文档。 是否值得花费在它上面?
我个人觉得是这样。 对于维护软件的未来开发者来说,文档通常是最有用的,特别是成员文档。
即使是公开的API文档,对于开发者以外的任何受众也是有限的。 以下文件 – 他们会感谢你。
这绝对是。 除了琐碎的软件之外,即使对于几个月后的原作者,也可以更快地理解代码并正确使用注释。
为了清晰起见,您应该重构代码,以便实现文档不是必需的。
不要使用自己的能力来评论你的代码,以便让你懒得编写明显的代码。
文件说,你的代码说,但用不同的语言相同的事情是多余的。 像冗余代码一样,这个冗余也必须保持,但是通常不是。
对对对。 logging您编写的任何代码。
最终有人会维护你写的代码。 文档是一种帮助他们进入编写特定代码的思维模式的方式。 私有函数对于文档来说尤其重要,因为它们在开发人员可以从中推断出不variables的代码中的用法最less。
当然是。 在六个月内,您可能需要回来做一些维护。 几个好的评论可以为您节省大量的时间和精力。 您可能不需要将其logging到公开API的范围内,但是一些评论从未受到伤害。
任何复杂的方法都是有趣而且不明显的,值得花些时间来澄清一些文档。
从现在起6个月,当你访问你的私人方法时,他们会像现在这样对你有意义吗? 你需要花费数小时试图追踪组件之间的关系?
根据我的经验,良好的文档不会浪费时间。
绝对。 总是写代码的假设, 你将被要求修改两年后。 方法总结是最重要的。 我不能告诉你有多less次我发现了错误,因为我正在写文档(总结,参数,返回),并意识到我错过了一些东西。
logging公共方法对维护者和使用你的包的人都很有用。
logging私有方法对维护者或包(包括你)是有用的。
总而言之,这是一个稍微不同的方式。 例如,logging私有方法并不需要是正式的。
我不会。 如果您的私有方法需要文档,那么可能需要花时间在这个区域使代码更清洁。
编辑:即使有一个总结,我不会文件。 私人的方法可以改变,重新萌芽,消失。 面向对象的基本原则之一是封装。 你不需要知道私人方法在做什么。 至于开发人员,谁将保持最新的所有这些文件? 你第一次,但将来?
编辑2:从评论
我强烈反对。 私有方法唯一不应logging(以某种方式)的时候,其目的是从其名称和源代码完全显而易见的。 如果你的代码中有什么“聪明的”,那么就应该解释为什么你这样做。
我非常同意但是..代码不应该是“ 聪明的 ”,代码应该是function性和可读性的 。 大多数情况下,你的目标应该是让你的代码对读者尽可能透明,如果你需要评论它,那么你应该看看在你使用javadoc(或者你使用的任何东西)之前让你的代码更清晰。
编辑3:
你最想看什么?
/** * This method doesn't do what you expect it to. * Below you will find a whole ream of impenetrable * code. Where there are bits that look that they do x, they don't * they do y. **/ private void someComplexInternalMethod() { ... badly named variables comments to describe intent perhaps some out of date orphaned comments as code has been removed but comment remains .... .... looong methods } private void WellNamedMethod() { ... well named variables shorter method, highly cohesive self documenting }
我将采取不受欢迎的立场,并说不。
我的许多私有方法在方法中是复杂的语句,需要注释的语句。 使他们成为私人方法的一半原因是为了澄清代码,并减lesslogging它所做的事情的需要。
只要代码改变,文档就需要维护和更新。 您现在要求维护开发人员做两次相同的工作。 一旦修复了这个错误,并且一次解释修复。
根据我的经验,第二个行动往往不会发生。 我从这里开始就inheritance了一个5年以上的代码基础。 在一个特定的应用程序中,大约一半的内容都经过了评论,而且很多时候 – 评论与实际代码几乎没有任何相似之处。 不pipe是他写信的时候,哥们儿都是酸的,还是他先写了代码,然后代码改了,评论也没有了。
现在我几乎没有阅读他们的意见, 大型应用程序中的每个应用程序或逻辑模块都有一个或两个页面文档,概述了它的通用性,一般结构以及任何与众不同的内容。
我们希望开发人员能够编写可读的代码,并且新员工能够读取可读代码。
现在,让投票开始!
是的,有必要logging你的私人方法。 越来越多的开发人员正在使用您的代码,并且正在修改您的代码。 私有方法像公共方法一样保护特定的function。 区别在于如何使用代码。 私有方法的文档加快了重构的速度。
就我个人而言,我更相信在代码文档中的自我logging代码。 大量使用意图显示名称,副作用函数等
但是有时候不可能让代码成为自己的文档,在这种情况下,我将永远logging函数或内部工作。
那么这个代码也应该可以维护,你不觉得吗? 当然,他们应该logging! 你将不得不在几个月内查看这些代码,当你做出改变的时候你会想要提到一些东西。
是。 我听到这个笑话:
编程就像性。 一个错误,你必须支持你的余生。
对于公共接口(例如公共方法和类),logging每个方法的目的 – 尽可能清楚地描述公共接口(即代码合同)。
对于私人成员(你将在那里实际完成这项工作),你可能要logging方法的目的。 但是,loggingalgorithm – 为什么以及如何,而不仅仅是代码的描述更有用。
任何未来的开发人员都可以访问您的私人成员,也可以访问您的代码。 如果我可以读你的代码,我可以弄清楚它在做什么。 但是除非我能读懂你的想法,否则我无法弄清楚你的代码为什么会这样做 – 除非你写了一些文档向我解释。
只有你没有什么比这更好的了。 因此 – 可能 – 不。
(反对共识)我强调自我logging代码(公开但私密)。 这可以是非常有效的,你将需要正式文件less得多。 有些人真的不喜欢这个(有时候是有原因的)。 由于您提到的是私有实现,所以随着时间的推移重新命名和修改的限制要less得多。 与less数特殊情况的界面是一个失败的秘诀(但他们仍然生产)。
文档:如果要使用大部分标题,最好是有意义的。
我有一个坏的/毫无意义的文档,因为像界面一样,没有比坏的好。 呵呵
如果你的方法名称没有立即明确,那么它们就不是很有名。 依靠有名的类和方法的文档总是会回来咬你。 所有这一切都是人们忘记更新文档的一些例子,最后你会得到一个可怕的混乱。 例:
坏
private void Update(string sValue, DateTime dValue) {...}
更好
private void UpdateEmployeeInformation(string jobTitle, DateTime hireDate) {...}
第二个版本需要logging吗? 这个名字标识了它的目的是什么,param的名字使得它明显地被传递了。
如果你的方法如此漫长而复杂,以至于他们需要一本小说来解释你需要将它们分解成function合理的逻辑位,这些逻辑位可以是有名的,高度集中的。 那个,恕我直言,比一些写得不好的内联文档要容易理解,这些文档可能是也可能不是最新的 – 我仍然要读通过所有的代码,以确保它与文档说明它应该做什么相匹配,在大多数情况下,我会假定文档没有被保留,并且忽略它。
你还应该有unit testing,可以使代码更灵活,使function更加明显。 使用命名的类,方法和unit testing附加文档的目的是什么?
现在我经常在开始编写代码之前编写类/方法级别的文档。 这对于保持良好定义的方法和单一目的的方法尤其有帮助,因为在你面前有一个提醒,它会告诉你什么时候你的课程/方法已经超出了你的初衷。
我不喜欢写任何其他可以编写代码的文档,但是我不觉得它会编码/debugging时间,因为向你自己解释你所要做的事情就是改善从你的思考时间输出。
方法注释还提供了一个有用的双重检查,因为如果代码不执行评论说的那样,那么在debugging时这是值得研究的。
从代码阅读器的angular度来看,因为有用的代码会被读取多次(数百/数千次),所以代码合同的注释使读者不必在下一级细节中找出代码的作用。 当您浏览数千行代码时,可以节省昂贵的精神上下文切换,从简略阅读到分析,并返回。
花费大量工作时间阅读大量代码的人员是负责保持系统工作的团队领导和架构师,并代表其开发团队与pipe理层进行谈判。 即使是写得很好的代码也很难快速读取,因为大部分代码将与读者感兴趣的级别处于不同的抽象级别。
如果代表开发团队的人不能快速阅读代码,就很难与pipe理人员进行循证的讨论,而决策又不受技术现实的影响。
经过多次重复,这给开发团队带来了困难,而在详细的层面上应用一些工程学科则是可以避免的。
并不是所有的系统都是庞大的,复杂的,只知道答案的大师们都是短小的,但是有些系统就是这样的,他们可以突然间就这样。 下一代专家将会感谢你logging你的代码。
私人领域呢? 对于Serializable类, 必须logging私有字段 。 从Johua Bloch的“Effective Java”
私有字段定义了一个公共API,这是该类的序列化forms,并且该公共API必须被logging。 @serial标记的存在告诉Javadoc实用程序将这个文档放在一个特殊的页面上,该页面logging序列化的表单