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

推荐订阅源

Recent Announcements
Recent Announcements
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Last Week in AI
Last Week in AI
Scott Helme
Scott Helme
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
L
LINUX DO - 最新话题
S
Security @ Cisco Blogs
Webroot Blog
Webroot Blog
S
Security Affairs
H
Hacker News: Front Page
TaoSecurity Blog
TaoSecurity Blog
W
WeLiveSecurity
G
GRAHAM CLULEY
T
Tenable Blog
Schneier on Security
Schneier on Security
S
Securelist
Cyberwarzone
Cyberwarzone
P
Privacy International News Feed
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
S
Schneier on Security
Hacker News - Newest:
Hacker News - Newest: "LLM"
Recent Commits to openclaw:main
Recent Commits to openclaw:main
O
OpenAI News
N
News and Events Feed by Topic
AWS News Blog
AWS News Blog
C
Cisco Blogs
T
Threat Research - Cisco Blogs
S
Secure Thoughts
大猫的无限游戏
大猫的无限游戏
C
Check Point Blog
The GitHub Blog
The GitHub Blog
G
Google Developers Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
美团技术团队
Martin Fowler
Martin Fowler
Microsoft Security Blog
Microsoft Security Blog
L
LangChain Blog
Apple Machine Learning Research
Apple Machine Learning Research
爱范儿
爱范儿
D
DataBreaches.Net
博客园_首页
MyScale Blog
MyScale Blog
博客园 - 叶小钗
博客园 - 三生石上(FineUI控件)
P
Proofpoint News Feed
J
Java Code Geeks
SecWiki News
SecWiki News
P
Palo Alto Networks Blog
Know Your Adversary
Know Your Adversary
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org

博客园 - 紫色阴影

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接口。大量的接口伴随着唯一的实现,为了测试而设计,也是不小的浪费。我想肯定有更好的办法,比如将某些耦合紧密的类看作一个组合,对它进行单元测试。针对这些问题,我还需要更多的学习。

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