惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

酷 壳 – CoolShell
酷 壳 – CoolShell
H
Hacker News: Front Page
P
Palo Alto Networks Blog
T
ThreatConnect
Apple Machine Learning Research
Apple Machine Learning Research
博客园_首页
T
True Tiger Recordings
P
Privacy & Cybersecurity Law Blog
B
Blog
IT之家
IT之家
Last Week in AI
Last Week in AI
F
Full Disclosure
Hacker News: Ask HN
Hacker News: Ask HN
C
Comments on: Blog
Microsoft Azure Blog
Microsoft Azure Blog
C
Cybersecurity and Infrastructure Security Agency CISA
Microsoft Security Blog
Microsoft Security Blog
博客园 - 【当耐特】
N
News and Events Feed by Topic
NISL@THU
NISL@THU
腾讯CDC
雷峰网
雷峰网
Security Latest
Security Latest
李成银的技术随笔
M
Microsoft Research Blog - Microsoft Research
L
LangChain Blog
L
Lohrmann on Cybersecurity
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
C
Check Point Blog
Y
Y Combinator Blog
Recent Announcements
Recent Announcements
博客园 - Franky
N
News | PayPal Newsroom
V
V2EX
A
About on SuperTechFans
The Register - Security
The Register - Security
月光博客
月光博客
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Google Online Security Blog
Google Online Security Blog
MyScale Blog
MyScale Blog
Cisco Talos Blog
Cisco Talos Blog
Vercel News
Vercel News
WordPress大学
WordPress大学
C
Cyber Attacks, Cyber Crime and Cyber Security
The Hacker News
The Hacker News
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
爱范儿
爱范儿
A
Arctic Wolf
L
LINUX DO - 最新话题
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More

博客园 - 紫色阴影

Android ellipsize的小问题 腾讯招聘贴 有意向的人发邮件或者msn Asp.net MVC tips -- 也做为 要写漂亮的代码 (2) - 紫色阴影 要写漂亮的代码 (1) 在团队中如何推行一项新的实践 - 紫色阴影 事件驱动的javascript 验收测试的自动化 - 紫色阴影 项目中的技术风险 欢迎需求变动,拥抱变化 成为MVP 使用动态数据库访问对象 使用Spring.Net对Web页面进行依赖注入 初窥Managed Extensibility Framework - 紫色阴影 Bug驱动开发简介 Unity的属性注入 持续集成简介 简单介绍使用WCF的Web编程模型开发REST风格的Web Service 尝试使用WatiN进行TDD - 紫色阴影 关于站立式会议
如何把握设计的尺度
紫色阴影 · 2008-06-10 · via 博客园 - 紫色阴影

  这个话题来源于下午和同事们的讨论,背景是这样的:他们在一个小项目上工作,周期是4周。第一周是第0个迭代,主要的工作为写Story,做Spike等。而此后便开始开发,前几天开发的速度比较慢。因为他们经常在写了一些代码后又觉得,恩,结构设计的不够漂亮,中间应该加一层之类的。所以大部分时间都在推翻设计,修改以及添加测试,重构代码,分解依赖,运行Build脚本,提交代码。

  问题就出现了,敏捷开发强调的是简单设计,Pair拿到一个Story的时候,分析业务需求,简单的讨论设计(大概15-20分钟),然后进行开发。在开发过程中发现有重复代码,进行重构,一切重复代码都得重构,包括测试。最终的结果就是,完成Story的时候,没有重复代码,这就是优良的设计。但是优秀的设计又要求容易扩展,需求变化的时候尽量少的修改。当代码能够很好完成它的功能,它就是有价值的,客户并不关心你的代码是否是低耦合,高内聚,也不关心它是否是多层架构的。花了很多时间做了高扩展的架构,到项目结束也没有要扩展的需求,这是否值得呢?

  适当的设计是必要的,过多的设计是浪费,关键是要把握设计的度。怎样才是必要的呢?当你知道某地方以后会变化,该地方就得对扩展开放。举个例子,如果要你实现解析文件,然后把信息存入数据库这样一个功能,当前只要求解析Xml,你可能会毫不犹豫的用XmlDocument。但是,后面的需求是必须支持更多的文件类型,比如Excel,Csv等,你就得考虑需要引入Strategy模式。我觉得这就是适当的设计,为以后的扩展提供支持。如果你不考虑也可以,只是后面的开发过程中会大量的重构,修改测试,花更多时间,别人会说你设计不好。那什么是过多的设计呢?很明显客户只需要支持Sql Server,那我在DAO中就使用SqlConnection等,而不必要引入Provider或者Sql Dialect以支持多数据库的变化。这样的设计就是浪费。

  良好设计的不二法则,面向接口编程。接口减少了类和类之间的依赖,提高了可测试性,很方便的引入DI框架。但是如果你看到我们项目的代码会发现,类之间全都是与接口交互,几乎所有类都会抽出接口,尽管它只可能有一种实现。这样做的目的是为了更好的使用Mock工具进行单元测试,当前还做不到Mock具体类而只能Mock接口。大量的接口伴随着唯一的实现,为了测试而设计,也是不小的浪费。我想肯定有更好的办法,比如将某些耦合紧密的类看作一个组合,对它进行单元测试。针对这些问题,我还需要更多的学习。

  希望大家都来讨论,你们在开发过程中是如何设计的,如何把握设计的度呢?