`
lpn520
  • 浏览: 47228 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

“过度设计”之真实例子

阅读更多
  我刚到了一家新公司,公司给我的感觉很不错,不过当开始做第一个项目时便有过度设计的嫌疑,项目不大,基本就实现CURD的功能,用struts2+spring+ibatis+extjs。拿我开发的一个简单的功能来讲,就花了大概一周,如果采用简化的技术,实际上可能只需要一两天。

  设计太多的分层,以及偶和性太高,添加或修改一个模块太困难了,而且还不知道会不会影响到其它模块。按照项目定义的规范做法,写一个Hello world,创建的代码文件个数必须达到8个!!!!

  过度分层已经成为过度设计的一个典型。项目经理说,这是另一个项目的架构直接搬过来用的,我们做一下架构上的优化。

  其实本来就没有什么优化,原来本就是简单的东西,为了显示技术,搞得特复杂。现在所谓的优化,实际上回归质朴而已。

  记得OSI7层模型就有过度设计嫌疑,可以去看一下现在的教材,都没有用OSI作为例子,尤其没有专门讨论会话层。

  如何防止过度设计,最好办法就是使用敏捷编程,他的思路就是刚刚好就行,如果有问题,再重构。另外我自己目前的实践方法就是多编程,少设计,好像也能避免。因为当你的任务主要是写代码的时候,你绝不会去写8个类来完成一个helloworld。

  其实,我所说的就是开发原型,也是《敏捷开发方法》里提到过的方法。


分享到:
评论
130 楼 southgate 2010-09-29  
张口闭口解耦
why解耦?
普通业务写在action里头有什么不好,清晰 简单
很长的业务 搞一个manager分离出去
重复地业务 搞一个common分离出去


把重用和解耦挂在嘴边的同学,你解耦过多少次

上周参加了一个接力短跑比赛,总共10个人参加,其中有8个人一步都没跑,接了棒子以后就传递给下一个人了。问他为什么这么干,他说他是专门跑山地的,不能跑平原。我说那你别参加啊,他说,我必须的参加,这样可以提高我们团队适应各种情况的能力。 

经典
129 楼 thoriod 2010-09-29  
其实去看看GOOGLE这样的公司,养团队而不做技术标准,做产品而不做业界规范,要程序员而不要业界大事,设计师都写代码。确实比较符合软件公司。

框架,脱离开发的设计都不人性化,都只是工商管理课程里面死记硬背的东西。人性化的公司有竞争力。
128 楼 ccxw1983 2010-09-29  
我们的稍好点,我们用的一个servlet处理多个action,更加acttype  调用不同的方法,楼主说的这种设计还是很常见的了,我看了常见的例子都是这样的,别奇怪,都是为了也许永远用不上的所谓的扩展性。
127 楼 thoriod 2010-09-29  
虽然很久没写java了,朋友的帖子还是说2句。
虽然我觉得这个整个就一水贴。

一直以来我对框架很反感,为什么呢,因为我觉得其实开发经常会遇见不一样的情况,那么自然设计不一样。
很奇怪了,凭什么每次我们开放都要弄杂七杂八这个那个的框架。早年间,做C++和C的怎么都是库来完成底层的东西。没什么框架不框架的。
就算是微软的DOTNET。那种Framework的形式不是也蛮好么。
好吧最早的设计模式都只是教我们在怎么去好好设计。这些框架很奇怪的实现一堆模式,然后告诉我们它是对的,我们应该在做项目的时候用框架强上,你这个又不是万能产品,每次我配置一大堆,写一大堆像脚本一样的语言有意思么。凭什么你的设计就是对的,你了解我项目的需求么。

我觉得我没发言权,只是发现身边的同事,很多人都很习惯这种东西,配置一大堆,对架构不清楚。
真觉得很奇怪了。

我一直在想有没有通过一些建站系统成立起来的大型网站,它们对这些建站系统没有改造,没有修改的,有这么一种系统可以万能通吃的。

我们的架构师,远离框架,设计出来的东西是否符合架构。我是真的不明白。
那种类库,封装部分功能,除了接口一切都是黑盒的真的不好么。框架做的就对么?

我想一个写过几年程序的人也会明白,SQL不要到处有,变量定义要谨慎,等等框架在做的事。如果没有还是请他回家吧。

没有银弹,可是我们好像在拿框架当银弹用,觉得换人就像换电脑。
126 楼 jasph77 2010-09-29  
lzxz1234 写道
终于看完了,发现强人太多了,压力很大很大


这个还好吧
javaeye有几个神贴,
记得好像是 从03年 一直讨论08年 整个帖子横跨5-6年
讨论领域模型。

最后明白一个道理,婆说婆有理 公说公有理。
适合自己的就是行。

杭州的javaeyer蛮多的,有机会出来聊聊,站内短信我。

最后广告上智*联搜索:‘省档案事务所’,最近公司大量招人java,delphi
125 楼 jasph77 2010-09-29  
系统架构原则很简单:
1、sql语句只能出现在DAO里面 (到处sql太乱)
2、DAO尽量简单,不要有太多的逻辑判断 (为了能更好的复用性)
3、Action只做跳转、json xml生成,无业务逻辑判断 (Action里有事务,不好控制)
4、service尽量做到有完整的业务逻辑功能,并进行事务控制。 (业务逻辑上的通用性,如:增加用户,我可以form表单提交、也可以用websevice调用,通过ejb访问)
124 楼 lzxz1234 2010-09-29  
终于看完了,发现强人太多了,压力很大很大
123 楼 jasph77 2010-09-29  
一般在系统架构阶段,采取集体创作方式。
1、头脑风暴阶段:充分分析业务,在业务基础上架构师提出自己的设计,说明设计原因。
2、设计讨论阶段:各成员 提成对架构的设计提出自己的意见。架构师采纳,如果不采纳说明理由。有争议以架构师说了算。
3、设计实现阶段:在大家通力合作下完成系统构架。

这样架构师的思想得以继承船舶,各成员才能得以发挥。

我一直避免谈,这样写是对的,那样写是不对的。
是要符合团队开发习惯,容易维护,加快、保证项目进度就是好的架构。
122 楼 soci 2010-09-29  
Helloworld这个例子不太清楚 这个Helloworld是Entity吗,按照这个架构action service其实要不了几个文件的。
dao因为和Entity一一对应可能会多点.如果有泛型dao可以继承 EntityDAO的代码会很少。
action的代码都是逻辑跳转代码也会很少。
service完成业务逻辑代码会多些。
分配任务的话干脆就固定一个人专门负责action一个人专门负责dao,其他人都做jsp和service
121 楼 jasph77 2010-09-29  
架构师的思想没有被好好的继承下去,只会依样画葫芦。

架构师在架构系统的时候 没有考虑的问题 没有及时的发现,被及时更正。

系统架构不单单是架构师的事情,是整个项目组或者整个团队集体思想的结晶。
120 楼 jasph77 2010-09-29  
有时候有弄明白自己到底想要什么?
为什么要这么写?
不要为了action而action,为了service而service

J2EE很多时候告诉企业开发,要这样做、可以这样做。
而很多人没去考虑 为什么这样做,这样做对自己有什么好处。
119 楼 jasph77 2010-09-29  
很多时候,弄出这么多Service、dao层。
都是为了规范代码,为了以后维护。
如果图方便 其实什么 Action Service dao 要它们干吗?
118 楼 lpn520 2010-09-29  
hsbcnet 写道
见过差不多十年前的代码,一个几万行的servlet,jsp里面又有好多逻辑,你看的想死。。。

兄弟,照您说的,那php,ruby,asp.net及早期的asp,不都得回家种菜了
117 楼 lpn520 2010-09-29  
<div class="quote_title">teclogid 写道</div>
<div class="quote_div">楼主,首先我要说你连最基本的事务边界可能都不清楚。Service层都没有,按你思路做出的系统,绝对存在数据的不一致性。<br><br>为什么要用接口?<br>这方面的好处,我就不说了,自己看书去。<br><br>Ext为什么要封装?<br>这样可以统一界面,如果你每个人都按自己一套创建一个panel,当需要在panel上都加一个按钮什么的,你需要改多少个jsp?人家只要改一个包装的js。任何项目都会用Ext.extend来封装自己的项目组件。<br><br>为什么js要提出到单独文件?<br>1.、编辑器友好,你在jsp里能代码提示吗,能校验吗?<br>2,方便压缩,js和html合并从来都不是什么问题,弄个ant任务就行了。<br><br>分的多不是问题,关键是分割都是必要的,按你的思路,弄一个jsp就写一个系统得了,来回请求这个jsp,用标志位判断执行哪一段,那岂不是超级简单了?这样你就爽了?</div>
<p> </p>
<p>一看您回的贴,就知道应该跟我们的架构师是同时期的人,首先我想说,struts2里的Action就是业务层,可以理解为Model,并非你们所理解的Controllor,可以参考struts2文档, 所以加Service层没意义,而且我们的一个Action还调用了多个Service里的方法,这个耦合怎么处理呢?  其次, 提到事务处理,你们加service层,不就是为了spring的申明式事务,让事务处理傻瓜化, 但spring的申明式事务只能事务一个方法, 像刚刚提到了,如果一个Action并列调用多个Service的方法,这个事务怎么一致呢? 您担心我存在数据的不一致性,我想问,手动事务处理是干嘛的呢? 不知道您写过类似这样的代码没,不知道您对SQL并发效率有研究过没:</p>
<p> </p>
<pre name="code" class="java">sqlMapClient.startTransaction();
sqlMapClient.startBatch();

......

sqlMapClient.executeBatch();
sqlMapClient.endTransaction();</pre>
 
<p> </p>
<p><strong>还有为什么要用接口?</strong></p>
<p>把接口当类型嘛,接口优于抽象嘛,我也不想说为什么。  我一般会在编写上层API与公共类库开发时会用“面向接口编程”, 你写一个业务逻辑实现的类,搞个“面向接口编程”,我怀疑不是吃撑了就是肚子痛。</p>
<p>说到看书,我一直在看,建议您也多看看。</p>
<p> </p>
<p> </p>
<p><strong>Ext为什么要封装?</strong></p>
<p>您的想法跟我们架构师一样, 你封装的有问题嘛, 整个系统的界面都有问题, 你改了一个模块嘛, 影响了一大堆模块, 明明会用EXT的人呢,被你这个封装搞得不会用, 当好不容易通过一两周的努力会用你的封装了, 却发现你封装的API改了。 </p>
<p>兄弟,我想说,你有能力,你够聪明,可以自己写个UI出来, 封装人家的,有啥意思呢, 没有一个搞封装的人不会被骂, 我建议您省省, 让你底下的人用他们最熟悉的方法编程吧,他们会感谢你的,他们如果发现你的东西好,自然会去学的。</p>
<p> </p>
<p> </p>
<p><strong>为什么js要提出到单独文件?</strong></p>
<p>这个其实小问题,只是文件太多了,跳来跳去麻烦而已,在JSP的&lt;script&gt;块里,IDE还是会校验的,不过我一般不用这个检验,可能习惯了写js就当文本写,咱机器不好,一个myeclipse,四五百M的内存,咱吃不销。</p>
<p> </p>
<p> </p>
<p>说到分层,本来框架就已经给你分了MVC三层,再加个DAO, 总共四层, 你又何必花费脑筋自己再去分层呢?  套用我提到的话:"多编程,少设计,刚刚好就行"。 要研究架构多去看看大型B/S系统分步式集群解决方案, 而不是在代码里花功夫,来套住你下面可怜的刚刚毕业的被模式框架搞得晕头转向的程序员。</p>
<p> </p>
<p> </p>
116 楼 hsbcnet 2010-09-29  
见过差不多十年前的代码,一个几万行的servlet,jsp里面又有好多逻辑,你看的想死。。。
115 楼 程序新手 2010-09-29  


     给大家看下同样是一个小项目的目录结构,同样也是SSI架构,个人觉得设计的很不错,代码也写的有参考学习的价值.仅供讨论
    
114 楼 程序新手 2010-09-29  
看到大家讨论这么多,我这个实习生有自信咯~
113 楼 lpn520 2010-09-29  
2022228 写道
2022228 写道
js单独放在一个文件中的好处:
客户端第一次请求后就会缓存,不会找服务器要了

如果你放在jsp文件中:
js的代码每次都要由服务器发给客户端,增加网络传输量

service层是用于事务处理拦截处理的,一般的系统需要。你们不需要的话,的确可以省掉这层。
dao层存在也合理啊,每张表一个dao





兄弟,JSP里的静态资源也会缓存下来的

112 楼 hubert_bubert 2010-09-29  
skycray 写道
IcedCoffee 写道
lpn520 写道
wangking717 写道
真想看看那个HELLOWORD分8个的代码,让我见识一下。

让你见识一下传说中的8个文件:

前端
helloWord.jsp                //页面文件,不用说了
helloWord.js                 //javascript文件

Struts的Action,就叫动作层吧
HelloWordAction.java         //Action类文件,客户端请求到这个类上

业务层
HelloWordService.java        //业务接口, 还用了一套传说中的“面向接口编程”
HelloWordServiceImp.java     //业务实现类,实现上面定义的接口

DAO层
HelloWordDao.java            //数据操作类,关于HelloWord业务的数据操作都在这里
HelloWord.java               //HelloWord表的ORM的对象
HelloWord.xml                //HelloWord表操作的SQL语句,ibatis的sqlmap




这个真的很正常...


+1.

再+1
111 楼 wujiazhao88 2010-09-29  
不算过度设计啊,普通的

相关推荐

    MVP例子一看你就懂

    - **避免过度设计**:虽然MVP模式有诸多优点,但过度使用可能导致代码过于复杂。需要根据项目的具体需求来决定是否采用MVP。 - **合理组织Presenter**:大型项目中,一个Presenter可能会变得非常庞大,这时可以考虑...

    当代设计研究理念—用户体验超人性化设计方法.docx

    上海地铁使用者的设计研究是一个很好的例子。研究者通过观察法、访谈法和自我陈述法收集素材,对乘客的真实行为、环境和时间进行分类,进而分析乘客的需求。他们将复杂的乘客行为过程简化为一系列环节,并通过马斯洛...

    给用户体验设计师的10条UX建议 .doc

    7. 留白的艺术:设计应避免过度复杂,注重留白,如滴滴出行的设计,简洁的设计能提升app的品质感和使用效率。 8. 不要把情感置于逻辑之上:视觉设计应服务于功能逻辑,美观的设计如果功能逻辑混乱,反而会干扰用户...

    500多个真实男头像2.zip

    其中,“500多个真实男头像2.zip”资源包就是一个典型的例子,它由某位热心的收集者精心准备,旨在为需要男性头像的用户提供丰富而真实的选择。 在现今的网络世界里,一个人的头像往往是社交身份的第一印象。尤其在...

    阻尼效果的例子

    - **性能优化**:使用节流和防抖技术来提高代码执行效率,避免过度渲染导致的性能问题。 通过实践这些示例,你可以深入理解阻尼效果的实现原理,并将它们应用到自己的项目中,创造出更加逼真的交互体验。同时,这也...

    Unity3d下CurvedUI使用例子

    在Unity3D中,UI设计是构建用户界面的关键部分,而CurvedUI则为开发者提供了一种创建曲面或弯曲界面的独特工具,使得UI元素能够在各种非平面的显示环境中更加自然和沉浸。 "Unity3d下CurvedUI使用例子"这个项目可能...

    打篮球与设计模式(关于设计模式)

    - 如果过度使用组合模式,可能会导致系统设计过于复杂。 ##### 8. **装饰模式 (Decorator)** 装饰模式允许在运行时动态地给一个对象添加新的功能。文中提到了将篮球场改造成足球场和舞会场地的例子。这相当于装饰...

    C#设计模式.PDF

    这部分内容将通过具体的例子来介绍设计模式的应用场景,帮助读者理解不同设计模式如何解决特定的问题。 ### 3. 先有鸡还是先有蛋? 这是一个引人思考的问题,旨在探讨软件设计中的某些基本哲学问题,比如在软件...

    autocomplete自动补全官方网站的例子

    7. 案例研究:为了进一步理解实际应用,官方网站可能会提供真实的使用场景或案例,帮助开发者了解如何在项目中集成自动补全功能。 总之,通过学习官方网站提供的自动补全例子,开发者可以掌握这一功能的核心原理和...

    极限编程的例子 老师发的课件

    2. 朴素(Simplicity):提倡以最简单的方式来解决问题,避免过度设计。 3. 反馈(Feedback):通过持续集成和测试,确保团队及时了解项目的进展和问题。 4. 勇气(Courage):鼓励团队面对困难,勇于改正错误和改进...

    23种设计模式的比喻

    - **缺点**: 可能会出现过度设计的情况,即在不需要使用组合模式的地方使用它。 **9. 装饰器模式 (DECORATOR)** - **应用场景**: 如果你想送给女友一个特别的生日礼物,比如一张照片,并希望在背后写上一些温馨的...

    MySQL一个索引最多有多少个列?真实的测试例子

    在设计表结构时,应谨慎选择需要建立索引的列,确保它们对最常见的查询具有高选择性,并且不会过度增加存储开销。如果需要基于更多列进行快速查询,可以考虑以下策略: - 使用复合索引,即包含最有区分性的前几个列...

    JavaScript设计模式之代理模式简单实例教程

    **JavaScript设计模式之代理模式详解** 代理模式是一种在软件设计中常见的模式,它允许我们创建一个代表原始对象的代理对象,以控制对原始对象的访问。代理对象可以在调用实际对象的方法之前或之后添加额外的功能,...

    android UI程序设计

    - **LinearLayout是最常用的布局之一**,可以设置子元素为水平或垂直排列。 - **垂直排列**:子元素从上至下依次排列。 - **水平排列**:子元素从左至右依次排列。 #### 十四、RelativeLayout布局 - **...

    无视用户体验?白鸦微博集中吐槽阿里系应用.docx

    白鸦赞扬了天猫应用的设计和运营,认为这是阿里巴巴系中表现较好的例子,或许是因为其外包背景带来的外部视角和专业设计力量。这也暗示了引入外部资源和多元观点可以提升产品的设计质量。 最后,白鸦特别提到一淘...

    世界文化遗产的保护和可持续利用教案.docx

    - “世界文化遗产的价值”部分,通过具体的例子如高句丽王城、布达拉宫等,阐述文化遗产在历史研究和文化交流中的角色,引导学生认识不同民族和地区的文化特色。 - “世界文化遗产的保护原则”部分,强调文化遗产...

    IxD敏捷式研究

    在这种背景下,“敏捷”成为了应对挑战的关键策略之一。360移动互联网产品的案例解析为我们提供了一个深入了解敏捷式研究与设计实践的机会。 **抢占新需求** 根据数据统计,中国网民数量已达到3.88亿,占总人口的...

    贵州省2016中考语文第三部分现代文阅读专题十三议论文阅读常考考点分课时突破课时讲解1

    【知识点解析】 本文主要讨论了现代社会中手机对人际交往的影响,...总之,文章警示我们要正视手机对人际关系的影响,避免过度依赖技术,珍视和保持真实的社交互动,不让手机成为隔阂我们与他人之间情感交流的障碍。

    高中历史第1单元全人类共同的宝贵财富——世界文化遗产第2课时世界文化遗产的保护和可持续利用试.pdf

    - 然而,过度的旅游开发可能损害文化遗产,如泰山的例子所示,无序的开发会破坏自然景观和文化遗产的完整性。 7. **遗产保护的挑战与对策** - 九寨沟和泰山的对比表明,管理部门需要在经济效益和遗产保护之间找到...

    SPICE仿真 - Bob Pease会说No吗?(转)

    他提醒我们,模型本身的不完善性可能会隐藏电路设计中的问题,因为SPICE模型通常是对真实物理现象的理想化抽象。此外,不恰当的使用或不准确的模型设定也可能导致误导性的仿真结果。 使用SPICE进行仿真时,工程师...

Global site tag (gtag.js) - Google Analytics