当你开发,你什么时候可以判断,如果你在你的应用程序中的很多不必要的班? 是否有你应该有多少个类有一定的限制吗?
Answer 1:
是不是真的有这样的事情“太多的课。” 什么可以是一个问题是“太多类做同样的事情。”
如果你觉得你在你的代码库中有太多的课,一个很好的方式来审计,这将是增加一些新的要求。 凡是迫使你做出一些修改代码。 (在源控制的一个独立分支,当然。)难的是如何使这些变化? 做一个相对简单的变化要求您修改类吨,吨? 如果是这样的话,那么有一个非常好的机会,你有太多的,但问题是不是数字本身。
这主要是在许多情况下,个人喜好的问题。 有经常与代码复用和码脱钩的权衡。 通过每一个关注分离出可能的,并具有许多小类的,你去夫妇一切从一切。 但是,你常常会发现,你必须在这种情况下重复的代码,因为大量的代码可能会做“同样的事情”,而是一个稍微不同的原因。
在另一方面,如果你坚持在代码永远不会重复的话,那么当你拿到较少的班级还经常与更多的结合最终因为一个类将有多个责任,这需要类似功能的代码。
在大多数情况下,底线是变革的阻力。 耦合与再利用是人们可以争论的长度,但软件的刚性是在争论变成实际工作量(钱)。 测试是多么困难做出修改代码。 然后尝试重新安排你的类/逻辑,你觉得会比较变化的接受,并再次测试的方式。 是否有一个显著的改善?
Answer 2:
一般很多的类意味着你很可能已经非常普遍解决你的问题。 这通常是好的,因为这意味着你希望能有一个更容易随时间变化的行为,当你最终需要。
在开发小项目,有时它可以更好更具体的(即一般较少)实现的事情更快,这可能导致较少的类,但可能较难,需要出现时改变。
只要类是非常有序的,有一个明确的目的,它应该不会有很多类的问题。
能有什么如何永远是一个问题是,如果类是紧耦合的,或者某些类别的责任没有明确定义。 有关连接更多信息,可以发现在这里 。
可以occour的另一个问题是在下面的评论中提到。 如果你的很多类都有类似的代码,你有一个重复的问题。 这通常会导致系统becuse如果需要,你必须做出改变多次复制代码的改变降低可维护性。 这通常是通过继承得到解决。
Answer 3:
肯特·贝克回答你的问题。 如由Kent Beck指定杰夫Langr在书中“敏捷软件工艺的清洁代码A手册”讨论了四个设计规则。
(按重要性排序)
- 运行所有测试
- 不含重复
- 表达了程序员的意图
- 最小化的类和方法的数量
肯特认为,务实的态度采取保留类和方法计数低。 他给adhearing以教条的规则,如所有类应该有接口的例子。 通常是但有时会出现在哪里,这可能不是必要的情况下。 然而,这条规则是简单设计的四个规则的优先级最低。
(注意,这是肯特·贝克认为,与其说是我的!)
Answer 4:
在一个项目中,我目前的工作我绝对认为我们使用了太多的类 - 或者至少,太多的对象/实例。
我们建立了一个CMS基于PHP / MySQL的,其中数据库中的每个记录和字段被表示为PHP对象。 这可能会导致成千上万的实例的同时,我们正在不断地运行性能问题/运行内存等。
当然,这可能不会在其他编程语言或其他要求的问题,而是表现为,在我看来,要考虑的事情为好。
Answer 5:
正如许多人都认为,“这取决于......”
通常它取决于你的方法,你的目标和你的团队成员的喜好和能力的结合。 如果你对单元测试非常严格的,你可能有很多的小的,一般类和依赖注入结束。 这也意味着,这是非常困难的个别团队成员看到你从所有是如此非常,非常通用的部件构建具体的整体。
我个人更喜欢思考建立在两个层次的API方面:由通用的,独立的部分的较低水平和较高的水平,我用一对夫妇的外墙,董事等提出一些具体的和有用的其他编码器。 这很像iOS的图书馆恕我直言的设计。
Answer 6:
这一切都取决于你的项目。 它取决于您的需求。
类必须在,有没有不需要的类的方式最小
类必须是在这个意义上,他们都分别包含有属性的最大值。
Answer 7:
一个应用程序都可以在一个代码文件或每个雾化功能可以在它自己的文件,唯一受影响的就是maintainabiliy。 可维护性可能意味着你自己的能力来导航的代码,或者它可能意味着其他人可以如何理解的代码,或是否有可能建立新的版本。
我不认为有这个总是适用于任何通用的准则,这取决于很多事情。 例如,在JavaScript编码时,您通常使用的含有较多的不相关的功能比,如果你在C#或C ++编码少(和更大的)文件。
如果您使用Visual Studio 2012,然后http://msdn.microsoft.com/en-us/library/bb385910.aspx和http://msdn.microsoft.com/en-us/library/dd264939.aspx拥有其相关信息如何代码度量和代码分析工作。
这是从代码度量基于自己的应用程序的Visual Studio 2012的报告的一个例子,该值在解释http://msdn.microsoft.com/en-us/library/bb385914.aspx 。
Project: <<Projectname>>
Configuration: Debug
Scope: Project
Assembly: <<Path>>
Maintainability Index: 84
Cyclomatic Complexity: 479
Depth of Inheritance: 8
Class Coupling: 189
Lines of Code: 903
Answer 8:
我认为这取决于哪个区域有大量的类。 如果有包含通用业务逻辑许多静态类,这将被认为是不好的静态类应该只用于普通的辅助方法。 静态类不应该包含常见的业务逻辑。
如果有不同类别的不同层保持基本相同的数据。 这将被认为是糟糕的DTO类不能跨层被复制。
但是,如果类有要求的适当分解之后被创建,那么我认为这其实是好事,有大量的类。
Answer 9:
哲学:
有这样的事太多了的东西。 你可以有太多和太少的类。 有些人喜欢假装更多的是自由的,因为他们可以利用的工具,如搜索作为创建过凌乱,很难导航和大的搜索空间的借口。 从长远来看,你一定会找到一个衡量的赤字。
我真的不知道有你能有多少类有一个上限。 你可以想办法望远镜的东西添加类无限期,从技术上来讲,无限。 如果你不能有太多的类,但你可以无限添加它们,那么你将永远不会完成对帐户您寻求有班数的程序,所以你可以有太多的类。
许多IDE年代使它很容易产生大量的类和串用他们喜欢的东西一代的样板,自动完成在一起,总有copypasta。 许多工具减少创作的本质上是往往无用代码的成本,但不尽可能多的降低膨胀的成本。 即使有助手,unbloated代码将总是工作较臃肿便宜(你只能降低税收,不能完全消除)。 如果你不关心它,它最终将成为一个问题。 即使你有喜欢的东西码扫描,精细和文件替换,然后等十次更多的还是十倍以上。 这意味着十倍以上的改变,更多的十倍出问题和努力每条线路消耗的量的十分之一。
很多人陷入思考他们正在通过增加更多的类减少复杂性的陷阱。 事实上,他们往往仅仅是打破了复杂性,从它们都涉及到的东西搬东西的路程,在间接的形式增加复杂性的层。 线性代码变得,
非线性不必要的(这是太多的段落的例子,虽然是公平的一个更好的例子可能是每个句子或单词一个段落是太多了,当你的段落成为句子,那么你真的没有两个独立的事情了,这可能有两个段落很多,证明当句子不再是一个不同的事情段落)。
检测:
最简单的方式来看待,这是如果你有路径A(单节点/一个函数/类/等),但它分解成A-> B,你实际上并没有获得任何。 你只是把一张纸,两个撕它,把它放在两个信封,然后将其发布到它的目的地。 如果事实证明你实际真正需要一个以上的边缘节点,那么你有所收获。 这将是A-> B,A->下的例子。 您可以使用图形分析嗅出了太多的对象。 如果你有大长链表或许多小链表(甚至数在所有),那么你或许可以说你有太多的类。 并非如此容易地检测各种形式的对象过激行为。 有太多的类作为你最终支持的灵活性水平和模型,只有一小部分的你只使用维护变得过于复杂。 这意味着大量的代码是不实际对应需要做什么。 仅这使得它很难维持作为代码的目的是主观而非客观的,它也可能是任意的。
你可以把一个代码库,并减少类的数量,直到你只有那些真正需要。 这意味着,只有那些需要便携性(约传递数据),在事情应该如何表现(周围路过的方法),并在需要的合理分离(处理主要概念独立比如坚毅,展示等),作为差异,需要进行重复数据删除。 如果无法工作,一个好的设计许多程序员会做反了,写代码,只拆分需要的地方服务需求的特定目的。
虽然衡量的,没有太多的课,也不是一个完美的符号的精确测量。 只有提示。 的所需的类的最小数量,并且例如最大之间的大的比率是一个暗示。 什么是大? 我会说100次绝对是怀疑,10倍相当可疑,5次略有怀疑。 这可以基于多个参数,虽然改变。
一个奇怪的措施是gzip压缩你的代码。 该压缩比更好更大的膨胀的机会。 这不,虽然,因为它需要的参考点一个完美的措施。 降低压缩比某些方面也可以是非生产性的,编码到一个特定号码天真永远不会去上班。
您可知道,如果你有很多类(或接口),如果他们让你这样做不会真正有助于你得到你的最终目标,或者如果他们会减慢你失望超过他们正在抓紧东西的工作。 这可能是主观的,但。 如果有人已经犯了太多的课,这意味着他们将不得不改变他们的习惯,这意味着有通常的编码更好的方法入会费。 在项目的开始,这是难以检测的添加代码通常是非常便宜的。 还没有依赖于它,于是层浅,等等。这不是至少要等到数月甚至一年成臃肿的一个项目,组织不力等的成本是显而易见的。 它不是直到项目变得几乎陷入僵局人们的注意。 很多人都不会知道或者如果一些需要一年应该真正实现了一年或半年。 有比较多很少一点。
如果你看看你的类,你可以挑选一些事情了。 如何在代码中有多少是面向对象的,又有多少是FO(定向与功能面向对象)?
实际上做一些事情,并直接面向功能代码的手段有助于最终结果。 这包括你需要的代码。 它可能会包括超越分配和转换运算符。 一般条件语句,分支,读取数据时,选择行动路线,并采取适当的行动,例如数据生成,突变或读取/存储针对IO。
面向对象的装置简单地使用类表示概念。 此代码几乎将你的程序代码放到一个说明性语言。 如果你的大多数课程都是简单的重类型检查,表示等的援助,那么你可能有太多。 那标志是类和方法与他们的名字的部分,可能是变量,允许你缩小这些类。 这方面的一个非常强烈的信号是,如果大部分内容,这些类做的是拳击。 简单地分配变量,但没有做太多别的。 这确实是具有结构过度且通常缺乏重复数据删除,动态编码或抽象的情况。
在明显的情况下,如果一类是根本就不会再使用它是一类太多的(如果它死码)。 就像是相同的,但名称不同类的东西也是一个好兆头。
原因:
这可以通过一些事情的旁白从使它很容易创建和连接东西放在一起(倾向于当你抽象的突破和做事动态令人鼓舞的是取代,但打破了IDE良好的生活习惯避免)机制来驱动。 我经常得到被困这个试图通过代表一切万无一失了,但是OO实际上是不够灵活,无法做到这一点,它往往被证明是YAGNI。 一个常见的问题是根本没有抽象的,你通常有变量展开到顶级的语言结构如之前提到的(这还链接到一个设计的一切直接暴露于IDE)。 这可能不仅背叛缺乏动态编码的,但交替使用预处理或相似的。 这是什么的样子基本上是定义的所有叶子的树。 尽可能带班要避免必须定义一个类为每一个可能的叶子。 采取极端的树扩张的标志可能是,你有一类原始的每一个可能的用途。 这也可能是一些更极端的一个标志。 所有类别的展开笛卡尔乘积。 在这种情况下,你不这样做简单的得到一个腿一类,但对于CatLeg,狗腿等类时通常有两个之间没有实际差异。 有些人可以做到这一点的类型检查的极端阻止一些人把狗腿上CatLeg。 这是一个讨厌的和共同的反模式。
太多了类的最大推动力之一是要坚持标准,从那里在不真正适用于您的情况云的尝试。 在这种情况下,你不响应你的编程问题。 要编程响应别人的问题。
这是很常见的事情,如固体。 它是要了解和理解的原则非常重要,如SOLID,能够运用它们,但同样重要的是知道什么时候不适用他们。
授课与大型图书馆OOP语言时,这一原则被大量使用。 如果您正在您要分发到世界,可能数以百万计的人患有各种可能的使用情况下,一个面向对象的库,然后要坚持面向对象的原则,导致了很多破事成化妆接口和类,使他们可以以不同的方式使用,使一块的功能不会有很高的机会,在另一种可能不需要拉。 你必须考虑,在这个世界上,你不希望创建图书馆的人可能要叉。 人们不希望这样做,因为他们随即成为他们打算重用的所有权,否则将很失落总成本的代码维护者。
这些原则也增添了不少的开销地狱不过,如果你的代码具有有限用户范围,完全在你的控制,等等,那么你可能有太多的代码,如果你正在做的“的方式,你应该”分布式码。 即使你有一个分配的代码,有时也可以是过于极端,以应付各种使用情况事前,你有时要找出什么是最有可能需要,然后一切将在需要时被改变。 对于一个小型图书馆,你可以负担得起投入大量的额外工作地狱。 对于一个大的代码库,你必须锻炼那里的开销将最有可能为自己支付。
反例:
在一个理想的世界里,您可以根据您的燃眉之急代码minimalistically和唯一。 有一种偏见,其中该方法优于上考虑过激的不是自我揭示。 不足之处是。 如果你有过少会直接提出自己。 这是很常见的干看。 增加一个功能,在添加另一种。 您复制并粘贴第一然后改变下半部分。 两个函数的共同顶部一半是重复的代码,它是立即自我揭露,他们需要进行重复数据删除。 通过创建第三个功能做到这一点。 你知道这不是一个功能太多,你有一个客观的可证明的理由来创建它。 由他人使用编写代码时,这种方法变得更加困难。 别人我并不一定意味着任何人。 我的意思是那些没有直接访问的代码库,一般的陌生人。 从本质上讲人谁也不会轻易/快速/廉价地在需要的时候打破了你的代码。 如果你不迎合这样的听众,那么你就不需要担心过早地打破了你的代码。
我最近使用的库在线太少类。 它包含有多个职责的类。 这将需要一个文件句柄(作为原始类型)写入到适当的基于调用的方法(如addImage,addText等)将其生成所述流然后也自动输出HTTP标头。
在一个理想的世界中,这类不应该作出了关于输出假设。 用途可能希望输出到文件系统,内存,TCP流等,只需要提供一个接口用一个简单的写方法,或者使用一个从标准库。 在我来说,我只需要通过字符串连接将它输出但要实现这一点,我不得不打开一个伪文件映射到内存(通常不会是可能的,但语言允许它作为一个黑客)。
我有这个问题的一些使用来自所有来源的随机库倍。 在某些情况下,这将是显而易见的,其中应该应用分离,有时不是。 如果有疑问,太少仍然跳动太多,因为你保证,最终了解它。 我倾向于观察,如果你添加任何东西,你真的不知道你会在显著膨胀领土结束。 如果你这样做一次,你可能会做两次,然后变成一种习惯。