作者cyclone350 (老子我最神)
看板java
标题[问题] MVC程式架构
时间Sun Sep 1 19:00:04 2013
大家好,因为这几年遇过几个web专案,有几个问题想起教大家
当然,我知道什麽是MVC,我也会用spring,也可能是我只懂皮毛,所以才会有以下问题
我会先分析专案所使用的程式架构,并尝试说明使用每个元件(如Dao)的原因
最後问一些问题,当中如果有错请指正,谢谢
首先资料是存在Database或是档案里面,为了方便(或是抽象),我们将结构化
的资料一对一对称到Java Bean,通常被称为是Entity,例如
资料库栏位跟值如下
id | name | age |
----------------------------
5566 | google | 10 |
----------------------------
会对应到以下Java Bean
public class Tablex {
public int id;
public String google;
public int age;
}
为了简化资料存取的逻辑,通常一个Entity会对应一个Dao class
例如要select资料只需要下列语法大概就能使用
tablexDao.selectByPK(5566);
再来是 MVC,优点不赘述
首先 view 一定是 JSP
controller 是一般的 Java class
model 是 view 跟 controller 来互传的 Java Bean
以 Struts2 来举例好了,Controller 是 Action class,
也就是说在Action 我们必须做一连串的动作来完成事情,
举一个例子,我要从tablex检查特定id资料有无资料
Action 可以写成如下:
public class testPageAction {
TablexDao tablexDao;
testPageFormBean formBean;
...
...
...
//假设Dao跟FormBean都设定完传好值开始跑
public void run() {
int pk = formBean.getId();
Collection resultSet = TablexDao.selectByPK(pk);
if (resultSet.isEmpty()) {
Page.forward("fail");
} else {
Page.forward("success");
}
}
...
...
...
}
对我而言,Action class 只是一个 workflow,
一连串的行为都必须到对应的Action 完成,当然为了 clean code 我们可以
设定一些 private method 来避免程式码重复等问题
有人可能会多写一个Function,例如
private boolean doSomething(int id) {
...
...
return false;
}
然後再 run 里面呼叫
public void run() {
...
...
x = doSomething(4);
y = doSomething2(1,x);
if(x || y) Page.forward("success");
Page.forward("fail");
}
以上,是我所认识的 MVC 架构
问题来了,我待过的每一个Web专案理,都会在Action 跟 Dao 中间夹带一层 Service
或是 manager...
而规定几乎是 "一个Action对应一个manager"
而 manager 所做的事,就像是把Action 的 private method 移到 manager 变成
public method ...
我完全找不到理由可以说明为啥要特地开一个 manager, manager的工作事项模糊不清
一个写在 manager 的 public method 完全可以改到自身
Action class 的 private method
而实际情况是,在写method时,有些程式设计师会写到 Action ,有些会写到 Manager
这完全没有意义,假设有 10 个 method,两位程式设计师可能写完全不一样
例如
程式设计师A: 1,2,4,5,6 写到 Action, 3,7,8,9,10写到 Manager
程式设计师B: 2,6,7,5,8,10 写到Action, 1,3,4,9写到 Manager
我所遇到的专案就是如此,有没有人能够解释 Service 或 Manager 的必要,以及它们
真正存在的意义在哪里?
苦恼很久了
谢谢大家看完
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 123.193.205.223
1F:推 popcorny:看完之後觉得MVC大方向没错,只是C怎麽写而已 09/02 08:12
2F:推 if4:楼上已经变成板标了... ^_^ 09/02 13:37
3F:→ swpoker:对喔~超好笑的啦~应该要水桶阿~这里是JAVA版不是C版~XDDDD 09/02 13:48
4F:推 popcorny:XDDD 我自己去水桶里面等... 09/02 13:53
5F:推 swpoker:我是dfd,不是ddd拉 09/02 18:29
6F:推 jtorngl:以前的经验,Service或Manager会做transaction control 09/03 02:59
7F:→ jej:推楼上.. 那是和那个案子的架构的transaction控制有关... 09/03 12:29
8F:→ jej:你可以把transaction都改成手动控制..然後在干掉这层XDD 09/03 12:31
9F:推 MagicPaul:我怎麽记得是多个Action对应一个manager,magnager在web 09/03 16:40
10F:→ MagicPaul:专案中只会有一个,所有的Action都会去问Manager 09/03 16:42