论坛首页 Java企业应用论坛

关于应用层次设计的讨论

浏览 17898 次
精华帖 (0) :: 良好帖 (4) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2012-04-12  
发现的框架多的不行,程序员都热衷学习各种框架的使用而忽视如何吸收优秀框架的思想,讨论面向对象的帖子越来越少。
0 请登录后投票
   发表时间:2012-04-12  
mqlfly2008 写道
KimHo 写道
ericchi 写道
jinnianshilongnian 写道
分层的主要目的是解耦,也包括内聚(相关类聚合在一个包中/模块中):

1、共性抽象是必要的,如CRUD。

2、如你开发个用完就扔的功能,则可以直接写具体类(控制器类、服务类、Dao类),无需定义接口,也没有必要定义接口,因为只有你再用,我认为是模块内聚的。

3、如果你需要对外提供服务,则应该定义且必须定义接口,接口就是契约,方便交流和测试,我认为这里主要为了解耦(服务消费者不需要知道服务是如何生产的)。

因此项目不管大小,抽象共性是必须,然后考虑高内聚(自己人使用),当需要为提供服务(许多人使用)时考虑低耦合。即项目大小不是绝对因素。

即实际项目开发可以这样:
1、自己人使用(模块内),全部使用具体类,不定义接口;
2、如果别人想用你(其他模块),你提供一个接口,只暴露需要的功能(窄接口)。



非常感谢,完全同意您的观点。
模块内内聚,模块间低耦合。

模块的划分,依据业务模型抽象。这样的设计,能够保证模块间依赖尽可能的小,一个模块内的变化尽量少的影响其他模块;一个模块能够单独的提供一类的服务,便于模块的独立,创造更大的伸缩空间。由于模块的规模相对系统来说,也比较小,因此一个模块的维护性更强,整个系统也更稳固。

不知我这样理解是否正确?


高内聚,低耦合是系统设计的灵魂,那么如何做到这点呢?
那就得有6大设计原则来保证了


如何做到高内聚,低耦合,我的理解是设计原则可以保持模块,而如何保持层于层之间的高内聚,低耦合,应该从更高的领域来看待,mvc就是一个很好的例子。

因为对某些个系统做了一些个假设,认为不需要暴露接口,而系统的生命期内,假设是否成立,没有人能够验证,也更加没有人能够保证!

在这种情况下,很多公司就开始使用第二种方式,当需要暴露接口的时候,代码需要大幅度的调整,并且可能导致层次间的耦合性提高!

所以,为什么mvc会得到很多人的赞誉,为什么很多人会自以为是的再mvc上做裁剪!

我想说,当你裁剪一种方式的时候,是否可以充分的验证下,裁剪的假设,更好的评估下项目的制约因素。


哈哈,说到了目前部分公司的症结了。
“因为对某些个系统做了一些个假设,认为不需要暴露接口,而系统的生命期内,假设是否成立,没有人能够验证,也更加没有人能够保证!“。非常经典到位的点评。
所以,没有验证下,就随意的裁剪。
0 请登录后投票
   发表时间:2012-04-12  
mqlfly2008 写道

在这种情况下,很多公司就开始使用第二种方式,当需要暴露接口的时候,代码需要大幅度的调整,并且可能导致层次间的耦合性提高!


对于这种情况(因为如我们企业开发 有很多模块都是独立的),万一有第三方需要,可以单独制定 窄接口(单独设计一套用户接口暴露),保持模块内部的内聚

对于从初期看外部就需要调用的,可以在初期设计成接口

SpringMVC很好的遵循开闭原则(对功能点的扩展是开放的,但对流程的修改是绝对不可以的),而且提供大量默认实现!


1、如SpringMVC的HandlerMapping 第三方需要这个东西,因此初期设计成接口是必然的;
2、如MappedInterceptor等直接”public final class MappedInterceptor“  因为内部使用,不允许你扩展。

没有完美,简单有效即可。
0 请登录后投票
   发表时间:2012-04-12  
ericchi 写道
mqlfly2008 写道
KimHo 写道
ericchi 写道
jinnianshilongnian 写道
分层的主要目的是解耦,也包括内聚(相关类聚合在一个包中/模块中):

1、共性抽象是必要的,如CRUD。

2、如你开发个用完就扔的功能,则可以直接写具体类(控制器类、服务类、Dao类),无需定义接口,也没有必要定义接口,因为只有你再用,我认为是模块内聚的。

3、如果你需要对外提供服务,则应该定义且必须定义接口,接口就是契约,方便交流和测试,我认为这里主要为了解耦(服务消费者不需要知道服务是如何生产的)。

因此项目不管大小,抽象共性是必须,然后考虑高内聚(自己人使用),当需要为提供服务(许多人使用)时考虑低耦合。即项目大小不是绝对因素。

即实际项目开发可以这样:
1、自己人使用(模块内),全部使用具体类,不定义接口;
2、如果别人想用你(其他模块),你提供一个接口,只暴露需要的功能(窄接口)。



非常感谢,完全同意您的观点。
模块内内聚,模块间低耦合。

模块的划分,依据业务模型抽象。这样的设计,能够保证模块间依赖尽可能的小,一个模块内的变化尽量少的影响其他模块;一个模块能够单独的提供一类的服务,便于模块的独立,创造更大的伸缩空间。由于模块的规模相对系统来说,也比较小,因此一个模块的维护性更强,整个系统也更稳固。

不知我这样理解是否正确?


高内聚,低耦合是系统设计的灵魂,那么如何做到这点呢?
那就得有6大设计原则来保证了


如何做到高内聚,低耦合,我的理解是设计原则可以保持模块,而如何保持层于层之间的高内聚,低耦合,应该从更高的领域来看待,mvc就是一个很好的例子。

因为对某些个系统做了一些个假设,认为不需要暴露接口,而系统的生命期内,假设是否成立,没有人能够验证,也更加没有人能够保证!

在这种情况下,很多公司就开始使用第二种方式,当需要暴露接口的时候,代码需要大幅度的调整,并且可能导致层次间的耦合性提高!

所以,为什么mvc会得到很多人的赞誉,为什么很多人会自以为是的再mvc上做裁剪!

我想说,当你裁剪一种方式的时候,是否可以充分的验证下,裁剪的假设,更好的评估下项目的制约因素。


哈哈,说到了目前部分公司的症结了。
“因为对某些个系统做了一些个假设,认为不需要暴露接口,而系统的生命期内,假设是否成立,没有人能够验证,也更加没有人能够保证!“。非常经典到位的点评。
所以,没有验证下,就随意的裁剪。


这种情况可以通过定义 用户接口解决
0 请登录后投票
   发表时间:2012-04-12  
jinnianshilongnian 写道
ericchi 写道
mqlfly2008 写道
KimHo 写道
ericchi 写道
jinnianshilongnian 写道
分层的主要目的是解耦,也包括内聚(相关类聚合在一个包中/模块中):

1、共性抽象是必要的,如CRUD。

2、如你开发个用完就扔的功能,则可以直接写具体类(控制器类、服务类、Dao类),无需定义接口,也没有必要定义接口,因为只有你再用,我认为是模块内聚的。

3、如果你需要对外提供服务,则应该定义且必须定义接口,接口就是契约,方便交流和测试,我认为这里主要为了解耦(服务消费者不需要知道服务是如何生产的)。

因此项目不管大小,抽象共性是必须,然后考虑高内聚(自己人使用),当需要为提供服务(许多人使用)时考虑低耦合。即项目大小不是绝对因素。

即实际项目开发可以这样:
1、自己人使用(模块内),全部使用具体类,不定义接口;
2、如果别人想用你(其他模块),你提供一个接口,只暴露需要的功能(窄接口)。



非常感谢,完全同意您的观点。
模块内内聚,模块间低耦合。

模块的划分,依据业务模型抽象。这样的设计,能够保证模块间依赖尽可能的小,一个模块内的变化尽量少的影响其他模块;一个模块能够单独的提供一类的服务,便于模块的独立,创造更大的伸缩空间。由于模块的规模相对系统来说,也比较小,因此一个模块的维护性更强,整个系统也更稳固。

不知我这样理解是否正确?


高内聚,低耦合是系统设计的灵魂,那么如何做到这点呢?
那就得有6大设计原则来保证了


如何做到高内聚,低耦合,我的理解是设计原则可以保持模块,而如何保持层于层之间的高内聚,低耦合,应该从更高的领域来看待,mvc就是一个很好的例子。

因为对某些个系统做了一些个假设,认为不需要暴露接口,而系统的生命期内,假设是否成立,没有人能够验证,也更加没有人能够保证!

在这种情况下,很多公司就开始使用第二种方式,当需要暴露接口的时候,代码需要大幅度的调整,并且可能导致层次间的耦合性提高!

所以,为什么mvc会得到很多人的赞誉,为什么很多人会自以为是的再mvc上做裁剪!

我想说,当你裁剪一种方式的时候,是否可以充分的验证下,裁剪的假设,更好的评估下项目的制约因素。


哈哈,说到了目前部分公司的症结了。
“因为对某些个系统做了一些个假设,认为不需要暴露接口,而系统的生命期内,假设是否成立,没有人能够验证,也更加没有人能够保证!“。非常经典到位的点评。
所以,没有验证下,就随意的裁剪。


这种情况可以通过定义 用户接口解决



对于接口的发现,个人观点是,可以适当的冗余设计,而且越早发现项目的结合部,对项目越来越有利,这是我认为可以冗余设计的观点的本源。

后期通过用户接口,重新在原有系统上架构一层分发(个人认为)

会直接导致新用户需求对接口的调整需求和原系统的需求调整,而这俩个需求很有可能调的都是原系统的某一部分的方法,或者是多个窄接口。

一个方法担负着多个需求源的方式,真的让人很担心该方法的承受能力!这应该也会提高对原系统的整体架构和代码管理的要求。

当然也可能是我对用户接口了解的不够,呵呵。。。欢迎指导

0 请登录后投票
   发表时间:2012-04-12   最后修改:2012-04-12
”这种情况可以通过定义 用户接口解决“

恩,定义接口可以解决。但正如上所说,有些人会做裁剪。
譬如,我提出的问题。

有人设计的时候,会把每个DAO接口省略。取而代之的,是在AbstractBaseManager中抽象一个共用的BaseDao实现。

这样就存在一个问题,要不要抽象。我抽象了,就意味着所有继承这个抽象类的都有这个共性。而这个是不是共性,存不存在潜在的变化,都没有验证。对于某些简单模块可能比较确定,但对于整个系统都这样应用,就有些牵强了。

所以,我认为有些接口是必须要定义或提供的。
0 请登录后投票
   发表时间:2012-04-12  
ericchi 写道

所以,我认为有些接口是必须要定义或提供的。

这个是肯定的
0 请登录后投票
   发表时间:2012-04-12   最后修改:2012-04-12
view
vo
action
logic
service
po
dao

以模块划分
0 请登录后投票
   发表时间:2012-04-13  
结构2的意思是只使用一个BaseDao吗? sql或者hql都定义在xml中?还是都在业务逻辑里面?  之前项目一般都是一个实体的操作对一个DAO,当然也会抽象出BaseDao
0 请登录后投票
   发表时间:2012-04-13  
crud0906 写道
结构2的意思是只使用一个BaseDao吗? sql或者hql都定义在xml中?还是都在业务逻辑里面?  之前项目一般都是一个实体的操作对一个DAO,当然也会抽象出BaseDao



恩,结构2的意思就是整个系统只使用一个baseDao。sql没有定义在xml,而是绑定到了业务逻辑层里,确切的说是每个Service中。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics