几年前我使用过OO编程语言和技术(主要是在C ++上),但是在这段时间内OO并没有做太多。
我开始在C#中创建一个小实用程序。我可以简单地对它进行编程而不使用良好的OO练习,但对我来说应用OO技术将是一个很好的复习。
与数据库规范化水平一样,我正在寻找一个清单,它会让我想起一个“好的”面向对象程序的各种经验法则 - 一个简明的是/否列表,我可以在设计和实现过程中偶尔阅读阻止我在程序上思考和工作。如果它包含适当的OO术语和概念,那么它将更加有用,以便任何检查项目都可以轻松搜索以获取更多信息。
有哪些内容可以帮助某人开发出优秀的OO软件?
相反,可以应用哪些'测试'来显示软件不是OO?
答案 0 :(得分:36)
答案 1 :(得分:11)
听起来你想要一些基本的是/否问题来问自己。每个人都给了一些伟大的“做到这一点”和“这样思考”的列表,所以这里是我对一些简单的是/否的解析。
我可以对所有这些回答是吗?
我可以回答所有这些问题吗?
只是快速的一些我的头顶。我希望它有所帮助,OOP会变得非常疯狂。我没有包含任何是/否的更高级的东西,通常是较大的应用程序的关注,如依赖注入或如果你应该将一些东西拆分成不同的服务/逻辑层/组件......当然,我希望你至少将您的UI与您的逻辑分开。
答案 2 :(得分:10)
聚集各种书籍,着名的C#程序员和一般建议(如果这些是我的,那就不多了;从某种意义上说,这些是我在开发过程中问自己的各种问题,但就是这样):
如果我是这样的话,我可能会把一些或所有这些扔出门:
这些原则有助于指导我的日常编码,并在某些方面大大提高了我的编码质量!希望有所帮助!
答案 3 :(得分:7)
Steve McConnell的Code Complete 2包含大量现成的清单,可用于良好的软件构建。
罗伯特·C·马丁的Agile Principles, Patterns, and Practices in C#包含很多优秀的OO设计原则。
两者都将为您提供坚实的基础。
答案 4 :(得分:7)
答案 5 :(得分:7)
我是否明确定义了 要求?可能没有必要提供正式的要求文档,但在开始编码之前,您应该有一个清晰的愿景。如果您不需要正式文档,思维导图工具和原型或设计草图可能是不错的选择。在软件过程中尽早与最终用户和利益相关者合作,以确保您实现他们所需的。
我是否重新发明轮子?如果您正在编码以解决常见问题,请寻找已解决此问题的强大库。如果您认为您可能已经在代码中的其他地方解决了问题(或者同事可能已经解决了),请首先查看现有解决方案。
我的对象是否具有明确的单一用途?遵循封装原则,对象应该与其操作的数据一起具有行为。一个对象应该只有一个主要责任。
我可以编写接口吗?按合同设计是一种很好的方法,可以启用单元测试,记录详细的,类级别的需求,并鼓励代码重用。
< / LI>我可以对我的代码进行测试吗?测试驱动开发(TDD)并不总是那么简单;但单元测试对于重构非常有用,并且在进行更改后验证回归行为。与Design By Contract合作。
我是否过度设计?请勿尝试编写可重用组件的代码。不要试图预测未来的要求。这些东西看似违反直觉,但它们会带来更好的设计。第一次编写代码时,只需尽可能直接地实现它,并使其工作。第二次使用相同的逻辑,复制和粘贴。一旦你有两个具有通用逻辑的代码工作部分,你就可以轻松地重构而不试图预测未来的需求。
我是否引入了还原剂代码?不要重复自己(DRY)是重构的最大驱动原则。仅使用复制和粘贴作为重构的第一步。不要在不同的地方编写相同的东西,这是一个维护的噩梦。
这是一种常见的设计模式,反模式还是代码味道?熟悉OO设计问题的常见解决方案,并在编码时查找它们 - 但不要试图强迫问题适合某种模式。注意那些属于常见“不良实践”模式的代码。
我的代码是否过于紧密耦合?松散耦合是一种尝试减少两个或多个类之间相互依赖关系的原则。一些依赖是必要的;但是你越依赖另一个班级,你在班级改变时就必须修复得越多。不要让一个类中的代码依赖于另一个类的实现细节 - 仅根据其合同使用对象。
我是否暴露了太多信息?实践信息隐藏。如果方法或字段不需要公开,请将其设为私有。仅公开对象履行合同所需的最小API。不要让客户端对象可以访问实现细节。
我是防御性编码吗?检查错误情况,并快速失败。不要害怕使用异常,让它们传播。如果您的程序达到意外状态,则中止操作,记录堆栈跟踪以供您使用,并避免下游代码中出现不可预测的行为要好得多。遵循清理资源的最佳做法,例如using() {}
声明。
我能在六个月内阅读此代码吗?良好的代码是可读的,文档很少。必要时发表评论;但也要编写直观的代码,并使用有意义的类,方法和变量名。练习良好的编码风格;如果您正在开展一个团队项目,团队的每个成员都应该编写看起来相同的代码。
它仍然可以使用吗?提前测试,经常测试。引入新功能后,请返回并触摸可能受影响的任何现有行为。让其他团队成员进行同行评审并测试您的代码。在进行更改后重新运行单元测试,并使其保持最新。
答案 6 :(得分:6)
最好的消息来源之一是Martin Fowler的“重构”一书,其中包含面向对象代码气味的列表(和支持细节),您可能需要考虑重构。
我还推荐Robert Martin的“清洁代码”中的清单。
答案 7 :(得分:5)
答案 8 :(得分:3)
请务必阅读并理解以下内容
答案 9 :(得分:1)
我喜欢this列表,虽然它可能有点密集而无法用作清单。
答案 10 :(得分:1)
UML - 统一建模语言,用于对象建模和定义类的结构和关系
http://en.wikipedia.org/wiki/Unified_Modeling_Language
然后当然是OO的编程技术(大多数已经提到过)
答案 11 :(得分:1)
有些规则与语言无关,有些规则因语言而异。
以下是一些与先前发布的规则相矛盾的规则和评论:
OO有4个原则: 抽象,封装,多态和继承 阅读它们并记住它们。
建模 - 您的类应该为问题域中的实体建模:
将问题划分为子域(包/命名空间/程序集)
然后将每个子域中的实体划分为类
类应包含对该类型的对象进行建模的方法。
使用UML,考虑需求,用例,然后是类图,它们是序列。 (主要适用于高级设计 - 主要类别和流程。)
设计模式 - 任何语言的良好概念,语言之间的实现不同。
结构与类 - 在C#中,这是按值或按引用传递数据的问题。
接口与基类,是基类,是接口。
TDD - 这不是OO,事实上,它可能导致设计不足并导致大量重写。 (例如Scrum建议不要使用它,对于XP来说这是必须的)。
C#的反射在某些方面优先于OO(例如基于反射的序列化),但它对于高级框架是必要的。
确保课程“不知道”其他课程,除非他们必须分成多个集会,并且缺少参考帮助。
AOP(面向方面编程)以一种极具革命性的方式增强OOP(例如参见PostSharp),至少你应该查看它并观看它们的剪辑。
对于C#,请阅读MS指南(在VS的MSDN帮助索引中查找指南), 那里有很多有用的指导方针和惯例
推荐书籍:
框架设计指南:可重用.NET库的约定,惯用语和模式
C#3.0 in Nutshell