一般开发论

这里仅讨论客户端-服务器

一.一般层次
0:客户端:客户端可以是:web,android,ios等等。客户端主要负责和用户交互、和服务器端交互等等。
1:路由层:主要负责分发请求,参数校验,调用服务,模板渲染等等
2:服务层:主要由领域模型构成,执行具体的请求服务
3:底层:执行机器操作,如持久化数据,访问第三方接口等等

服务层
服务层主要由领域对象构成,领域模型具体构造依赖于请求的类型,主要包括瞬时请求和非瞬时请求。
瞬时请求:
瞬时请求尽可能转换为无状态处理方法,即请求完成后,程序中没有任何状态保留。所有的数据都在参数中,最终的状态保存到数据库和文件系统中。服务等会映射成一系列sql和io操作。设计这类服务只需要把相似的功能放在一起即可。这类方法基本不会被继承覆盖,因此可以设计成静态方法。面向对象的方法在这几乎没什么用处。
领域的最终模型在数据库,而不是程序。这样的程序仅仅是对数据库和IO操作方法。因此,数据库、文件系统的设计和维护是最核心的部分。
例如:
public class UserService {
	private static Logger log = LoggerFactory.getLogger(UserService.class);
	public static User signin(SigninParam param) {
		try(Connection con = MysqlPool.get()) {
			User user = Sqlx.SelectOne(con , "select id,name,group from users where username=:username and password=:password" , param ,User.class);
			return user;
		} catch (SQLException e) {
			log.error("UserService.signin sql error" ,e);
			throw new CodeException(Codes.NO_SUCH_USER);
		}
		
	}
}
public class SigninParam {
	public String username;
	public String password;
}

ORM的选择:我倾向于把sql映射对象的工具,ORM应该尽可能简单。最好直接写sql,复杂的sql需要优化。
代码应该尽可能保持简单,如无必要不要引用第三方框架。
非瞬时请求:
只有对象长期存在于内存中,才需要使用面向对象的方法,才需要用程序去建模,维护各种状态,处理各种事件等等。
举个例子:在线课堂。在线课堂服务器端程序模型至少要在上课期间长期存在。课堂的各种状态都需要即时保存,如课堂的状态,所用用户的连接,课堂的实时数据等等这些数据都应该存在于内存中,即我的模型不是瞬时的,而是较长时间的存在。
我们要做的是,维持课堂模型生命周期,创建、初始化、处理事件、销毁对象等等
public class Course extends Room{
	private List<Client> clients;
	private Client teacher;
	private int courseId;
	
	public Course(int courseId) {
		this.courseId= courseId;
	}
	@Override
	public void handleMessage(Message message) {
		switch (message.cmd) {
		case start:
			break;
		default:
			break;
		}
	}
	public void close(){
		
	}
}


模块的划分:
模块的划分应该以根对象为标准。根对象是能独立存在而不依赖于其他对象。领域模型设计时,不能以用户为核心,应该以领域功能本身为核心,用户只是使用者。

猜你喜欢

转载自uzoice.iteye.com/blog/2369031