有必要给初学者解决下“月经题”,散分!

kosora曹 2013-08-04 04:41:26
都是关于面向对象的,http://bbs.csdn.net/topics/390528973 http://bbs.csdn.net/topics/390536618
花了点时间给两个楼主解答,同时希望初学者少走弯路,不要在为“面向对象”而面向对象,要提前理解JavaBean+DAO的模式(简单的说,就是把数据和方法完全分离;如果实在还不理解,就回忆下C语言的"结构体+函数式"编程的思想,面向过程你能理解吧,换了个更简单的面向对象怎么就纠结了?),简化今后的编程,加快JavaSE学习的速度。
为什么现在有泛型,为什么有反射,为什么有纯POJO?这些思想就是要让你的“数据”和“操作”完全分离;类似于“冰箱具有--开打、关闭方法,汽车具有--行驶、刹车方法”的代码绝对绝对不能再出现在Pojo当中了!
以后谁再写以下这种2B代码你们项目经理跟你没完

package beantest.bean;

/**
*冰箱
*
*/
public class Fridge {
private String name;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

/**
* 冰箱具有打开的行为
*/
public void open(){
System.out.println("打开"+name);
}

/**
* 冰箱具有关闭的行为
*/
public void close(){
System.out.println("关闭"+name);
}
}

企业级的设计思路有MVC以及SSH框架的单例、代理、Aop等等,
但面向对象基本上只有Dao+JavaBean,没有其他;连继承都很少,纵观马士兵、张孝祥、韩顺平的SSH视频,只找到两个:HibernateTemplate、ActionSupport而已;所以,如果初学者再过分的纠结于所谓的抽象、封装、继承、多态,只会耽误学习Java的进度!
比如一个帖子问到:
老王和老李是夫妻。老王是一名大学教授,老李是一名会计,他们的父母都健在。老王和老李有一个儿子,15岁了,在上中学。老王有时候去打太极拳,老李有时候去兼职讲课。用OO的思想描述他们的关系


可以这样解答,诸位可能有更加优美的代码但设计思路在20年之内是不会变的
下面是项目的包结构:
db里边是数据库(我们现在用List代替真正的数据库)
bean包里边是实体(习惯上称为JavaBean、POJO、Entity等等)
dao包里边是增删改查的类(对一个数据的基本操作就是CRUD)
logic包是业务逻辑层(如:判断两人是否是夫妻,判断父母是否健在等等)
util包用于存放:数据字典以及一些常用的正则、IO、日期的工具类


package beantest.bean;

/**
*爱好
*
*/
public class Hobby {
/**
* 主键--在数据库中的下标
*/
private int id;
/**
* 名称
*/
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Hobby(int id, String name) {
super();
this.id = id;
this.name = name;
}
@Override
public String toString() {
return "Hobby [id=" + id + ", name=" + name + "]";
}

}


package beantest.bean;
/**
* 职业
*/
public class Job {

/**
* 主键--在数据库中的下标
*/
private int id;

/**
* 名称
*/
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Job(int id, String name) {
super();
this.id = id;
this.name = name;
}
public Job() {
super();
}
@Override
public String toString() {
return "Job [id=" + id + ", name=" + name + "]";
}

}


package beantest.bean;

import java.util.List;
/**
* 人
*/
public class Person {

/**
* 主键--在数据库中的下标
*/
private int id;
/**
* 姓名
*/
private String name;
/**
* 性别 1-男 2-女
*/
private int male;
/**
* 年龄
*/
private int age;
/**
* 是否在世
*/
private boolean isLive;
/**
* 父亲id引用 -1表示不存在
*/
private int fatherId;
/**
* 母亲id引用 -1表示不存在
*/
private int motherId;
/**
* 爱人的id引用 -1表示不存在
*/
private int loverId;
/**
* 职业的id引用 -1表示不存在
*/
private int jobId;
/**
* 由于可以有多个爱好,所以一个人拥有爱好ID的集合
*/
private List<Integer> hobbyList;
public List<Integer> getHobbyList() {
return hobbyList;
}
public void setHobbyList(List<Integer> hobbyList) {
this.hobbyList = hobbyList;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getMale() {
return male;
}
public void setMale(int male) {
this.male = male;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public boolean isLive() {
return isLive;
}
public void setLive(boolean isLive) {
this.isLive = isLive;
}
public int getFatherId() {
return fatherId;
}
public void setFatherId(int fatherId) {
this.fatherId = fatherId;
}
public int getMotherId() {
return motherId;
}
public void setMotherId(int motherId) {
this.motherId = motherId;
}
public int getLoverId() {
return loverId;
}
public void setLoverId(int loverId) {
this.loverId = loverId;
}

public int getJobId() {
return jobId;
}
public void setJobId(int jobId) {
this.jobId = jobId;
}
public Person() {
super();
}
public Person(int id, String name, int male, int age, boolean isLive,
int fatherId, int motherId, int loverId, int jobId) {
super();
this.id = id;
this.name = name;
this.male = male;
this.age = age;
this.isLive = isLive;
this.fatherId = fatherId;
this.motherId = motherId;
this.loverId = loverId;
this.jobId = jobId;
}
@Override
public String toString() {
return "Person [id=" + id + ", name=" + name + ", male=" + male + ", age="
+ age + ", isLive=" + isLive + ", fatherId=" + fatherId
+ ", motherId=" + motherId + ", loverId=" + loverId + ", jobId="
+ jobId + "]";
}


}


package beantest.dao;

import java.util.List;

/**
*单表 CRUD的类
*/
public class BaseDao<T> {
/**
* 操作哪个表
*/
private List<T> table;

public BaseDao(List<T> table) {
super();
this.table = table;
}
/**
* 插入
*/
public void insert(T t){
table.add(t);
}
/**
* 查询
*/
public T query(int id){
return table.get(id);
}

/**
* 修改
*/
public void update(T t,int id){
table.set(id, t);
}
/**
* 删除
*/
public T delete(int id){
return table.remove(id);
}
}


package beantest.db;

import java.util.ArrayList;
import java.util.List;

import beantest.bean.Hobby;
import beantest.bean.Job;
import beantest.bean.Person;
import beantest.util.Dectionary;

/**
*数据库,每个数据库的记录的id从0开始
*
*/
public class DataBase {
public static List<Person> personDb=new ArrayList<Person>();
public static List<Job> jobDb=new ArrayList<Job>();
public static List<Hobby> hobbyDb=new ArrayList<Hobby>();
//初始化数据库并设置关联
static{
//初始化person数据库
Person p0=new Person(0, "老王的父亲", Dectionary.Male, 60, Dectionary.Live, -1, -1, 1,-1);
Person p1=new Person(1, "老王的母亲", Dectionary.Female, 60, Dectionary.Live, -1, -1, 0,-1);

Person p2=new Person(2, "老李的父亲", Dectionary.Male, 60, Dectionary.Live, -1, -1, 3,-1);
Person p3=new Person(3, "老李的父亲", Dectionary.Female, 60, Dectionary.Live, -1, -1, 2,-1);

Person p4=new Person(4, "老王", Dectionary.Male, 40, Dectionary.Live, 0, 1, 5,0);
Person p5=new Person(5, "老李", Dectionary.Female, 40, Dectionary.Live, 2, 3, 4,1);

Person p6=new Person(6, "儿子", Dectionary.Male, 15, Dectionary.Live, 4, 5, -1, 2);
personDb.add(p0); personDb.add(p1); personDb.add(p2); personDb.add(p3);
personDb.add(p4); personDb.add(p5); personDb.add(p6);
//初始化job数据库
Job job0=new Job(0, "教师");
Job job1=new Job(1, "会计");
Job job2=new Job(2, "上中学");
jobDb.add(job0);jobDb.add(job1);jobDb.add(job2);

//初始化hobby数据库
Hobby h0=new Hobby(0, "太极拳");
Hobby h1=new Hobby(0, "兼职讲课");
hobbyDb.add(h0);
hobbyDb.add(h1);

//设置爱好
List<Integer> wangList=new ArrayList<Integer>();
List<Integer> liList=new ArrayList<Integer>();
wangList.add(0);
liList.add(1);
p0.setHobbyList(wangList);
p1.setHobbyList(liList);
}
}

...全文
3327 103 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
103 条回复
切换为时间正序
请发表友善的回复…
发表回复
kiyoki 2013-09-12
  • 打赏
  • 举报
回复
楼主不愧为MVC模式的专家
u010178674 2013-09-06
  • 打赏
  • 举报
回复
引用 48 楼 wandefajin 的回复:
很好的月经贴呢!
为啥叫月经贴啊??
zhaogang 2013-09-04
  • 打赏
  • 举报
回复
LZ 用心良苦啊
浅忆流觞 2013-09-04
  • 打赏
  • 举报
回复
好贴,顶一个
kosora曹 2013-09-03
  • 打赏
  • 举报
回复
引用 98 楼 okafor2011 的回复:
有几个问题: 1.logic 类如何定义? 一个实体对应一个? 当系统变大后,logic类的行数变多 2000- 3000 , 如何处理? 2.获取一个Person 是否成年的方法在logic里面还是在 Person里面? 3.javaBean 应该是指实现一类逻辑的 class?
1、小系统的话,一个实体对应一个Logic;大系统的话,一个小模块对应一个,如登录、日志和回复、相册管理等等都可以写成不同的类。 2、PersonLogic里,或页面直接使用JSTL标签。 3、从目前不含EJB的系统来讲,javabean==pojo==entity;其他的叫做“组件component”。
okafor2011 2013-09-03
  • 打赏
  • 举报
回复
有几个问题: 1.logic 类如何定义? 一个实体对应一个? 当系统变大后,logic类的行数变多 2000- 3000 , 如何处理? 2.获取一个Person 是否成年的方法在logic里面还是在 Person里面? 3.javaBean 应该是指实现一类逻辑的 class?
abandon9527 2013-09-03
  • 打赏
  • 举报
回复
引用 19 楼 SmallYamateh 的回复:
[quote=引用 13 楼 u011405885 的回复:] 能讲讲开发的顺序吗?先搞哪个包?
正常的开发过程中,先搞bean、db(存放ddl语句、sql脚本等等),他们是ORM一一对应的,这样先把实体和数据库建好; 然后写BaseDao,只写基本的CRUD;再写每个实体的dao; 然后logic,logic调用dao;遇到复杂的查询,再回过头来在某个实体Dao里边写特定的SQL或HQL语句; 然后写main或junitTest测试logic的正确性; 最后再写Jsp和servlet。 Util包贯穿始终,比如写JavaBean的时候要定义常量,我们就去写 Dectionary;sql要用到日期和String的转换,我们就去写DateFormatUtil;页面要用到上传下载,我们就去写IOUtil;前台接收的参数要在servlet中判断合法性,如身份证、邮箱的验证等等,我们就需要去写RegExpUtil。 [/quote] 大学自己架构过项目,Util这一步学习了
尘歌 2013-08-29
  • 打赏
  • 举报
回复
一直以为自己不是初学者了,大量阅读后才发现还需要巩固啊~
pleasanton 2013-08-22
  • 打赏
  • 举报
回复
即使不写的话也会隐含调用?不懂
pleasanton 2013-08-22
  • 打赏
  • 举报
回复
super: call a constructor or method of the superclass. 我不至于连super都不懂吧?只是觉得没必要用
pleasanton 2013-08-22
  • 打赏
  • 举报
回复
why use super()?


public Hobby(int id, String name) {
    super();
    this.id = id;
    this.name = name;
}
pleasanton 2013-08-22
  • 打赏
  • 举报
回复
JavaBean==POJO==Entity ???
xy_jj 2013-08-22
  • 打赏
  • 举报
回复
楼上有人super()这个都不明白,这就是java里子类构造函数调用父类构造函数的方法,即使不写的话也会隐含调用,如果他不学习继承,请他懂嘛?
xy_jj 2013-08-22
  • 打赏
  • 举报
回复
虽然我是菜鸟,但我不认为为了求快而忽略基础,楼主也是过来人,学会封装,继承,多态,对理解抽象类,接口,以及面向对象的设计思路和模式有着根本性的意义,对理解jdk的API也有很大帮助,这也必将决定你以后在技术上能走多远。如果我们是为了企业而去学习快速的模式那和那些去做销售的有什么区别
kosora曹 2013-08-22
  • 打赏
  • 举报
回复
引用 85 楼 u011405885 的回复:
JavaBean==POJO==Entity ???
在目前的MVC模式中基本上可以这样说,dao、service、servlet等等严格来说并不是JavaBean;而EJB里边的各种Javabeans过于复杂,暂时抛弃EJB是明智的选择。
kosora曹 2013-08-22
  • 打赏
  • 举报
回复
引用 86 楼 u011405885 的回复:
why use super()?


public Hobby(int id, String name) {
    super();
    this.id = id;
    this.name = name;
}
Eclipse自动生成的。
clovey10000 2013-08-22
  • 打赏
  • 举报
回复
学习了 、、、、
yongod 2013-08-21
  • 打赏
  • 举报
回复
新手学习了
zgcy123456 2013-08-20
  • 打赏
  • 举报
回复
引用 32 楼 qiyuexuel 的回复:
MVC分层模式就很棒的,建议初学者别总往jsp中写java代码,尤其是dao层的
没这样干的吧?
Neil_Zhao 2013-08-20
  • 打赏
  • 举报
回复
我落后了,看来要更新一下自己的知识结构了。
加载更多回复(80)

62,634

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧