几年前我使用过OO编程语言和技术(主要是在C++上),但是在这段时间内,OO没有做太多.
我开始在C#中创建一个小实用程序.我可以简单地对它进行编程而不使用良好的OO练习,但对我来说应用OO技术将是一个很好的复习.
就像数据库规范化水平一样,我正在寻找一个清单,它会让我想起一个"好的"面向对象程序的各种经验法则 - 一个简洁的是/否列表,我可以在设计和实现过程中偶尔阅读以防止我从思考和程序上的工作.如果它包含适当的OO术语和概念将更加有用,以便任何检查项目都可以轻松搜索以获取更多信息.
什么应该在一个有助于某人开发优秀的OO软件的清单上?
相反,可以应用什么"测试"来显示软件不是OO?
Daf*_*ees 37
Sea*_*ver 11
听起来你想要一些基本的是/否问题来问自己.每个人都给了一些伟大的"做这个"和"想那样"的列表,所以这里是我的一些简单的是/否的破解.
我可以对所有这些回答是吗?
我可以回答所有这些问题吗?
只是一些快速的我的头顶.我希望它有所帮助,OOP会变得非常疯狂.我没有包含任何是/否的更高级的东西,这些东西通常与较大的应用程序有关,例如依赖注入,或者你应该将某些东西拆分成不同的服务/逻辑层/组件....当然我希望你至少将UI与逻辑分开.
RCI*_*CIX 10
从各种书籍,着名的C#程序员和一般建议中收集(如果这些是我的,那就不多了;从某种意义上说,这些是我在开发过程中问自己的各种问题,但就是这样):
如果我是这样的话,我可能会把一些或所有这些扔出门外:
这些原则有助于指导我的日常编码,并在某些方面大大提高了我的编码质量!希望有所帮助!
史蒂夫麦康奈尔的代码完成2包含许多随时可用的清单,以便进行良好的软件构建.
Robert C. Martin 在C#中的敏捷原则,模式和实践包含了许多优秀OO设计的原则.
两者都将为您提供坚实的基础.
我有明确的要求吗?可能没有必要提供正式的需求文档,但在开始编码之前,您应该有一个清晰的愿景.如果您不需要正式文档,思维导图工具和原型或设计草图可能是不错的选择.在软件过程中尽早与最终用户和利益相关者合作,以确保您实现他们所需的.
我重新发明轮子了吗?如果您正在编码以解决常见问题,请寻找已解决此问题的强大库.如果您认为您可能已经解决了代码中其他地方(或者同事可能有)的问题,请首先查看现有解决方案.
我的对象有明确的单一目的吗?遵循封装原则,对象应该具有与其操作的数据一起的行为.一个对象应该只有一个主要责任.
我可以编码到接口吗?Design By Contract是一种很好的方法,可以实现单元测试,记录详细的,类级别的需求,并鼓励代码重用.
我可以对我的代码进行测试吗?测试驱动开发(TDD)并不总是那么容易; 但单元测试对于重构非常有用,并且在进行更改后验证回归行为.与Design By Contract一起携手并进.
我是在过度设计吗?不要尝试编写可重用的组件.不要试图预测未来的要求.这些东西看似违反直觉,但它们会带来更好的设计.第一次编写代码时,只需尽可能直接地实现它,并使其工作.第二次使用相同的逻辑,复制和粘贴.一旦您有两个具有通用逻辑的代码工作部分,您就可以轻松地重构而无需预测未来的需求.
我是否介绍了还原剂代码?不要重复自己(DRY)是重构的最大驱动力.仅使用复制和粘贴作为重构的第一步.不要在不同的地方编写相同的东西,这是一个维护的噩梦.
这是一种常见的设计模式,反模式还是代码味?熟悉OO设计问题的常见解决方案,并在编码时查找它们 - 但不要试图强迫问题适合某种模式.注意代码是否属于常见的"不良实践"模式.
我的代码是否紧密耦合?松散耦合是一种尝试减少两个或更多类之间的相互依赖性的原则.一些依赖是必要的; 但是你越依赖另一个班级,你在班级改变时就必须修复得越多.不要让一个类中的代码依赖于另一个类的实现细节 - 仅根据其契约使用对象.
我暴露了太多信息吗?练习信息隐藏.如果方法或字段不需要公开,请将其设为私有.仅公开对象履行合同所需的最小API.不要使客户端对象可以访问实现细节.
我是防守编码吗?检查错误情况,并快速失败.不要害怕使用异常,让它们传播.如果您的程序达到意外状态,则中止操作,记录堆栈跟踪以供您使用,并避免下游代码中出现不可预测的行为要好得多.遵循清理资源的最佳实践,例如using() {}声明.
我能在六个月内阅读此代码吗?良好的代码是可读的,文档很少.必要时发表评论; 但也要编写直观的代码,并使用有意义的类,方法和变量名.练习良好的编码风格; 如果您正在开展团队项目,团队的每个成员都应该编写看起来相同的代码.
它还能用吗?早期测试,经常测试.引入新功能后,请返回并触摸可能受影响的任何现有行为.让其他团队成员进行同行评审并测试您的代码.在进行更改后重新运行单元测试,并使它们保持最新.
小智 6
其中一个最好的资源是Martin Fowler的"Refactoring"一书,其中包含面向对象代码气味的列表(和支持细节),您可能需要考虑重构.
我还建议罗伯特马丁的"清洁代码"中的清单.