以下三个接口,大部分都相同,只是主键定义不一样,怎么编排它们?
是分成三个独立的接口好?
还是把公共的地方提成一个基接口,不同的地方再放到各自的接口中?
或是把这三个合并成一个接口,用不到的方法就以空代码充之? public interface IHeaderBll
{
DataRow GetInfoByKey(string key);
DataRow GetInfoExByKey(string key);
DataTable GetListByWhere(string sAnd);
DataTable GetListExByWhere(string sAnd);
DataTable GetListLstByWhere(string sAnd);
void SaveList(DataTable dt);
void SaveInfo(DataRow rowEx);
bool DeleteInfoByKey(string key);
} public interface IHeader2Bll
{
DataRow GetInfoByKey(string parentKey, string key);
DataRow GetInfoExByKey(string parentKey, string key);
DataTable GetListByWhere(string sAnd);
DataTable GetListExByWhere(string sAnd);
DataTable GetListLstByWhere(string sAnd);
void SaveList(DataTable dt);
void SaveInfo(DataRow rowEx);
bool DeleteInfoByKey(string parentKey, string key);
} public interface IDetailBll
{
DataRow GetInfoByKey(string key, int seq);
DataRow GetInfoExByKey(string key, int seq);
DataTable GetListByWhere(string sAnd);
DataTable GetListExByWhere(string sAnd);
DataTable GetListLstByWhere(string sAnd);
void SaveList(DataTable dt);
void SaveInfo(DataRow rowEx);
bool DeleteInfoByKey(string key, int seq);
}
是分成三个独立的接口好?
还是把公共的地方提成一个基接口,不同的地方再放到各自的接口中?
或是把这三个合并成一个接口,用不到的方法就以空代码充之? public interface IHeaderBll
{
DataRow GetInfoByKey(string key);
DataRow GetInfoExByKey(string key);
DataTable GetListByWhere(string sAnd);
DataTable GetListExByWhere(string sAnd);
DataTable GetListLstByWhere(string sAnd);
void SaveList(DataTable dt);
void SaveInfo(DataRow rowEx);
bool DeleteInfoByKey(string key);
} public interface IHeader2Bll
{
DataRow GetInfoByKey(string parentKey, string key);
DataRow GetInfoExByKey(string parentKey, string key);
DataTable GetListByWhere(string sAnd);
DataTable GetListExByWhere(string sAnd);
DataTable GetListLstByWhere(string sAnd);
void SaveList(DataTable dt);
void SaveInfo(DataRow rowEx);
bool DeleteInfoByKey(string parentKey, string key);
} public interface IDetailBll
{
DataRow GetInfoByKey(string key, int seq);
DataRow GetInfoExByKey(string key, int seq);
DataTable GetListByWhere(string sAnd);
DataTable GetListExByWhere(string sAnd);
DataTable GetListLstByWhere(string sAnd);
void SaveList(DataTable dt);
void SaveInfo(DataRow rowEx);
bool DeleteInfoByKey(string key, int seq);
}
否则实现的挺麻烦的
比如说你某个类要同时实现这三个接口
那么对于这三个接口中的相同方法
你要这样写:
IHeaderBll.GetListByWhere(string sAnd)
{}
IHeader2Bll.GetListByWhere(string sAnd)
{}
IDetailBll.GetListByWhere(string sAnd)
{}
public interface CommandMethod<T>
{
DataRow GetInfoByKey(T primaryKey);
void Delete(T primaryKey);
DataTable GetListByKey(T primaryKey);
}public class PrimaryKey
{
}
public class Header1PrimaryKey : PrimaryKey {
public string Key{get;set;}
}
public class Header1 : CommandMethod<Header1PrimaryKey>
{
public DataRow GetInfoByKey(Header1PrimaryKey primaryKey)
{
...
}
}
{
DataRow GetInfoByKey<T,V>(T parentKey, V key);
DataRow GetInfoExByKey<T, V>(T parentKey, V key);
DataTable GetListByWhere<T>(T sAnd);
DataTable GetListExByWhere<T>(T sAnd);
DataTable GetListLstByWhere<T>(T sAnd);
void SaveList(DataTable dt);
void SaveInfo(DataRow rowEx);
bool DeleteInfoByKey<T, V>(T parentKey, V key);
}
提取接口与提取基类一直困扰着我,因为这没绝对的提取与不提取,提取的度很难反握。以前一个主子表录入的界面我数了一下,居然用了十层继承来实现,发现继承一般超过三层的话系统结构就显得拥肿难以维护(本来继承是用来让代码更简洁清晰的)。 @4、6楼,
觉得没什么改变反而更麻泛,而且我们这里很多电脑用的是win2000,烦型的很多功能(.net3.5)用不了。
实际只有 IDetail.GetInfoByKey(string, int) 这个方法有效。
我还是选择第2种方法好,这样清晰点,不然后面维护的人会搞不清 IDetail.GetInfoByKey(object, object) 到底要怎么用。这不是开发的问题,是做人的问题,做人真难,左右都是错
Dal层我只是实现了几个简单的 GetDataTable(sql)、SaveDataTable(sql, datatable)、GetString(sql),且Dal层是一个封装好的完整工厂模式的Remoting三层结构:SqlBll。这里的Bll层其实是把原本应放在服务器端的Dal层提到客户端来了。
Model模块也取消了,改为了DataRow,因为泛型不好排序、没有状态、写得太烦锁、太死板。UI层(WinForm,当然也可以用WebForm)我都不想搞什么继承了,考滤得太多了,这东东要搞到啥时?
现在的时间基本上不是花在写界面,而是花在如何组织结构、精简代码上。在ASP时代写出一个界面算一个界面,要出新界面时 Ctrl+C & Ctrl+V 再稍加改改就OK了。
可以用泛型方法IDetail.GetInfoByKey<T,K>(T o1, K o2)。@12楼
分层为了松散耦合便于迁移、代码复用,还有每个人可以关注自己的部分。如果业务不复杂变化又快、又是一个人开发,分太多层不见得好,往往一次改动引起级联修改,从上改到下,维护开发工作更大。
其实总结上面各位高手的那些建议不妨采纳一些东西,既然定义了3个接口并且这3个接口中只有GetInfoKey方法签名是不同的,那么就可以将他们提取出来将它们单独声明成接口.另外,至于那些相同的东西可以封装成一个接口.
毕竟"臃肿的接口是对接口的污染"