我读了很多关于 OOP 设计中好的和坏的实践的文章。很高兴知道您的设计是好还是坏。但如何从糟糕的设计转向优秀的设计呢?我已将接口(xaml)和代码隐藏从主业务逻辑类中分离出来。最后一个班级越来越大。我尝试过将其分成更小的班级,但现在陷入困境。关于如何拆分大班级有什么想法吗?主类有 1 个不同类型的数据列表。我不仅对总数进行计算,而且对各个类型进行计算。我有执行这些计算的方法,这些计算是从代码隐藏中处理的事件中调用的。有什么想法从这里去哪里吗?

附加信息:

我们已经开始这个项目大约 6 个月了。我多年来一直使用面向对象的语言(首先是 c++、java,现在是 c#),但从未参与过像这样的大型项目。我相信我们一开始就犯了一些错误,我认为我们需要纠正这些错误。目前我无法透露该项目的任何细节。我要订购一两本关于设计的书。如果我将所有类分开,如何将它们重新组合在一起?也许以这种方式继续第一个版本并在第二个版本之后重建部分会更好?

有帮助吗?

解决方案

  

在主类具有数据的1名列表   不同种类。我正在做   总的计算,而且对   个别类型。我有方法   以执行这些计算,其   从处理的事件被称为   代码隐藏。任何想法从哪里去   这里吗?

如果有基于列表的内容,你有没有考虑移动运营成一个自定义列表类大量计算的?这同样适用于操作的具体类型,或许他们可以住在里边的类型?

在执行不同类型类似但不同的操作方面考虑使用状态模式(认为这是对switch语句的替代),使你治疗实体以均匀的方式。

很多OOP的是约扔掉“自顶向下” /微操方式和考虑“自下而上” /自给自足的方法。值得记住的是,无论方法是孤立“正确的”。创建维护的代码就是找到一个合理的平衡这需要大量的思想和通常是通过经验开发。

其他提示

练习和阅读。重复 :)

一些推荐书籍:

  • 罗伯特·C·马丁 (Robert C Martin) 的《干净的代码》
  • GoF 设计模式
  • 马丁·福勒的重构

就我个人而言,我也喜欢 Head First 设计模式,但这种风格可能并不适合所有人。有一本类似的书,名为《C# 3.0 设计模式》(请参阅 ora.com)。它有很多相同的东西,但以更传统的方式。

我强烈建议拿起代码完成。这是一个伟大的书,提供对像你这样的问题吨的好建议。

要给你一个快速的回答你关于如何分割大班的问题,这里有一个很好的经验法则:使你的类,负责一两件事,只有一两件事。当你开始思考这样的,你能迅速识别出不属于代码。如果事情不属于,因子它成一个新的类,并从原来的类中使用它。

编辑:采取这一思维下的“方法”的水平,太 - 让你的方法负责一两件事,只有一两件事。有助于很快碎裂大(> 50线)的方法分解成的可重复使用的代码块。

改变你对对象的方式。每个对象都应该有一个非常特殊的责任。如果你有一个类名为通用的东西,像“MainBusinessLogic”你可能做错了什么。

大的地方开始:阅读大卫·韦斯特的的对象思考

这仅仅是一个增编这里一些细微的书建议。

在更好的我得到OO,更多的我似乎以减少对象的大小。它不象我要为小物体的大小或任何东西,但它似乎发生。

让他们小,单一的责任,简单的使用和理解 - 所有关键。每个对象应尽可能靠近防弹可能,请检查您的参数,绝不允许你的对象处于无效状态。清楚界定在文档的所有有效的状态。

在创建一个类的任何时间,创建该类的测试。它不仅考验你的代码,但迫使你消耗自己的设计。总是把自己的类从“外观”。确保你是不是要求太高了使用类和任何你要求的他应该在界面上记录的人。通常我只是抛出一个快速的主成类,如果没有可用的测试框架 - 它把如何在同一个文件就在那里用你的代码的例子

在编码中,我的几乎所有时间都花在试图找出什么别人没有。如果我能够用已知的或有据可查的API刚刚推出的代码,我的工作是琐碎和时间表显著短。

设计一可能很难。考虑编码类似于运动能力的能力。我们大多数人的发挥我们的车道,一些游戏在当地的运动队。做的好了,前脸设计上的复杂项目是国家联赛球员的任务,他们都是万里挑一的。接受这一事实,规划变更 - 迭代是你的朋友。 (顺便说一句,我们大多数人认为我们在州一级容易。我们不是)。

在除了由罗伯特·马丁çBrian的推荐的清洁代码的的,你可能要在“Bob大叔的”的面向对象设计的 SOLID原则。

您可以听到他谈论关于 Hanselminutes播客145 和干净的SOLID原则在 .NET代码岩石!展会#388 。还有更多的与他在 .NET岩石!展会#410 ,但他谈论什么是不是真的与你的问题,我只是包括它的情况下,你喜欢的第2位。

三个播客我优选Hanselminutes中。

由Martin Fowler重构是关于如何改变一个很好的书不破坏它的软件设计。

设计模式的工作方式类似于algorithims但将告诉您如何对象组合以执行各种有用的任务。

最后马丁福勒有多种应用程序有用的设计图案的。例如无源视图

迈克尔羽毛的 “修改代码的工作”应该是非常好,但我会承认,我没有看过自己。

也是一样的 “重构到模式。

我发现,一个复杂的“分配”工作没有帮助,然后看怎么别人这样做是对我是一个很大的学习经验。

在一个特别的任务是创造一个银行类节目里,我们不得不跟踪交易,并能计算出这样的事情赚取利息和。这的确是我的第一个面向对象的程序,并因为它的复杂一个真正伟大的一个。它变得太混乱(初学者)做线性风格不犯错误。

我只能说,我什么工作,我还没有真正找到任何人谁的工作方式相同,所以我不知道这是否会帮助你了。

基本上,我的方法是具有少类作为可能的,但没有减少。

首先,您需要保存信息的唯一的一次是,如果你在时间A处接受它,需要它在以后的时间B.如果你得到它,并在同一时间在上面工作,这可能是因为没有必要存储它。

二,你怎么用它做什么?如果你将要通过它在一定的简化方式实现迭代,你可以把它作为一个指令集,并在其上运行为指令集的解释程序。在这种情况下,你可能会想实际设计一个字节码指令集,具备翻译,并编码在该指令集的信息。

第三,多久的信息改变?如果某些信息只改变极少,你也许能够使用部分评估(即代码生成)。也就是说,你拿不频繁变化的信息,并用它来生成一个特设的程序,做什么你的整个程序将执行与该信息,但速度要快得多。代码生成器很容易写,因为它仅与所述输入的信息,即缓慢变化的部分涉及部分

许多数据结构的我看到这些天存在支持UI。这显然不是拿着用户关心的对象,最好你不应该去关心无论是。所以,我为UI的一个DSL隐藏所有灏山楂。

如果你所能远离事件,并通知了,因为它们发生在时间点,因此代表在状态的增量变化。你将必须强烈地担心自己可能被丢弃,复制或乱序。经常使用它们的理论是,当实际上经常发生相反的情况的简单的轮询式的将是“低效率”。

所以,当我看到有人让所有的班技术包裹等,通常是因为他们正在数据结构的过大的交易。

只是我的downvote诱饵...

我推荐羽毛的 有效地处理遗留代码, ,可用且可搜索 苹果浏览器, , 超过 重构. 。它充满了有用且富有同情心的章节,例如 我没有太多时间,我必须改变它我的应用程序没有结构。

需要考虑的观点:

  1. 自动化设计质量测试 - 寻找能够提供设计质量指标的工具,作为对您的设计决策的交叉检查。
  2. 代码可测试性 - 您的任何重构是否有助于或阻碍测试驱动开发、编写单元测试或编写功能测试?一旦集成,测试大型架构会有多困难?
  3. 理由 - 您如何捍卫这些决定,从愤世嫉俗的 CYA 到管理层,更重要的是,让您的团队相信重新设计。你能轻松、一致地解释吗 为什么 进行了更改,6 个月后是否可以轻松找到该解释?

设计上的个人喜好,尤其是重构:

  1. 概念类 - 如有疑问,如果有一个明确的概念,则应将其包装在类中,而不是隐含为一个或多个方法中的行为。
  2. 沟通很多带有责任的小事 更容易思考和审核。当对设计如何映射到现实世界有疑问时,回到旧的 责任驱动设计 写下每个班级的职责的方法。如果你觉得这很难,那么你对每个类所做的事情的概念可能是混乱的,或者他们做得太多了。
  3. 如果事情很正常,就不要被它吓到。有时,例如:GUI 上有很多事件处理程序,您将合法地拥有比指标建议的方法或属性多得多的类。

试着写更多的测试代码,仅此一点就强迫我研究和实施改善的OOP实践/设计理念。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top