我是一个oo初学者,想向大家讨论一下方法责任划分的问题。
问题描述:
代码是C#的,请大家帮忙指教
需求是:用户查询自己已经记录过的饮食情况。
有user类和food类。
第一种设计是(直接由User类来直接读取数据):
public class User
{
private string username, email;
...//省略get;set
public List<Food> readFood()
{
//这里读取数据库获取信息
}
}
public class Food
{
string foodname, foodweight;
...
}
第二种设计(User类委托Food类来查询):
public class User
{
private string username, email;
...//省略get;set
public List<Food> readFood()
{
//这里委托Food类进行处理
Food food = new Food();
return food.readFood(this.username);
}
}
public class Food
{
string foodname, foodweight;
...//省略get;set
public List<Food> readFood(string username)
{
//这里读取数据库获取信息
}
}
1.请问以上两种方法,一种是直接在用户类中读取数据库,一种是委托Food类自己来读取数据库,哪一种好一些呢?
2.第二种方法中由于Food类中含有readFood方法,并不是一个纯的实体类,那么,用这么一个不是纯实体类来传递参数好不好?会不会有违反oo原则之嫌?
3.第二种方法的情况下,如果我为Food类单独声明一个属性专用接口,用于传递属性,这样好不好呢?是不是有点画蛇添足了呢?(代码如下)
public interface IFoodModule
{
string Foodname { get; set; }
string Foodweight { get; set; }
}
public class Food : IFoodModule
{
...//省略get;set
public List<IFoodModule> readFood(string username)
{
//这里读取数据库获取信息
}
}
答
对,我的意思是说,接口尽量定义一些不变的东西。接口最大的弱点就是不适应频繁的变动。
是否可以提供一个封装比如
[code="java"]
public class FoodParameter {
String Foodname { get; set; }
String Foodweight { get; set; }
//etc...
}
[/code]
然后再
[code="java"]
public interface IFoodModule
{
FoodParameter getFoodParameter();
}
[/code]
这样的目的是使接口定下来。
答
1.两种都可以,如果说一定要说谁好,委托的略胜一筹
2.OO的原则没有违反,这时的Food已经不是简单的JavaBean了而已。
3.接口传递参数当然没有问题,但是如果Food的属性多了就要增加接口。最好不要这样做。