当前位置:编程学习 > C#/ASP.NET >>

关于三层架构中重复代码

本人目前在做一个winform程序 其中有个表单 不少项目是下拉菜单选择的 数据要从数据库读出来 
但是数据之间都是无关的 就是说下拉菜单都是把整个表的数据读出来 SQL中没有where;

下拉菜单大概5个左右 
我是定义实体层有 id name 两个属性 重写了ToString()方法 叫他返回 name属性
ComboBox里面直接把实体丢进去 读的时候object强制转回实体 再取里面的ID这样实现的

这样弄完发现实体层 BLL DAL 包括界面 都有5份类似的代码 

比如说 BLL层里 
a1Manager
a2Manager
a3Manager
a4Manager
a5Manager
这样的5个(实际命名不是这样的)
DAL 实体 也都是这样一排
本来想用简单工厂 想想又有点无从下手

问:如何去掉重复代码 还是说大家都这样复制粘贴的

麻烦提供点参考代码 非常感谢


--------------------编程问答-------------------- 不是复制粘贴的,要是重复代码太多,以后维护会累死的
你应该提取公用的 --------------------编程问答--------------------
引用 1 楼 gxingmin 的回复:
不是复制粘贴的,要是重复代码太多,以后维护会累死的
你应该提取公用的

是啊 我也这样想 能详细说说吗 --------------------编程问答-------------------- 可以这样做

一个大类(菜单类有你的5个菜单类的集合,这样就可以做到返回类型都是 “菜单” 类型 )
public class 菜单
{
private list<菜单一> list菜单一
public list<菜单一> List菜单一 
get{ return list菜单一}
set{list菜单一=value}

private list<菜单一> list菜单一
public list<菜单一> List菜单一 
get{ return list菜单一}
set{list菜单一=value}

private list<菜单二> list菜单二
public list<菜单二> List菜单二
get{ return list菜单二}
set{list菜单二=value}

private list<菜单三> list菜单三
public list<菜单三> List菜单三 
get{ return list菜单三}
set{list菜单三=value}

public 菜单()
{
list菜单一=new list<菜单一>()
list菜单二=new list<菜单二>()
list菜单三=new list<菜单三>()

}

}

DAL 层一个方法 根据参数(菜单几)获取菜单几的数据,就获取菜单几的数据。有很多菜单,可以添加枚举
public 菜单 得到菜单(枚举 菜单几)
{
比如传进来的是菜单1
菜单 c=new 菜单()
菜单1 c1=new 菜单1()
获取数据库中菜单1表的数据
比如你用Datareader
while (dr.read)
{
c1.name=dr(“name”)
c1.id=dr("id")
c.List菜单一.add(c1)
}
return c
}

这样BLL只有一个方法 返回类型都是 “菜单类型” 只是参数不同而已
public 菜单 得到菜单(枚举 菜单几)
{
return service.得到菜单(枚举 菜单几)
}

界面很简单了 传不同的参数 获取不同的菜单
比如得到菜单1
foreach d in manager.得到菜单( 枚举 菜单1).list菜单一
{
combox.items.add(d.name)
}

没有在环境中写,总体这样 应该可以的...
--------------------编程问答-------------------- c1.name=dr[“name”]
c1.id=dr["id"]
c.List菜单一.add(c1)


VB 写多了 忘C#了 应该是中括号 --------------------编程问答--------------------
引用 3 楼 net_java_dram 的回复:
可以这样做

一个大类(菜单类有你的5个菜单类的集合,这样就可以做到返回类型都是 “菜单” 类型 )
public class 菜单
{
private list<菜单一> list菜单一
public list<菜单一> List菜单一 
get{ return list菜单一}
set{list菜单一=value}

private list<菜单一> list菜单一
……


两个list菜单一属性 删掉一个  读取数据时,new 菜单一 放while里面 不然会出现只有最后一条数据 --------------------编程问答-------------------- 还没看 怕你还有话说 先顶一个 --------------------编程问答-------------------- --------------------编程问答--------------------
引用 3 楼 net_java_dram 的回复:
可以这样做

一个大类(菜单类有你的5个菜单类的集合,这样就可以做到返回类型都是 “菜单” 类型 )
public class 菜单
{
private list<菜单一> list菜单一
public list<菜单一> List菜单一 
get{ return list菜单一}
set{list菜单一=value}

private list<菜单一> list菜单一
……


感觉应该还有别的办法吧 这样可能是简化了一些 
但是这样没有利用到这些菜单都是一样的结构啊 

只是把五个菜单简单捏在一起而已 --------------------编程问答--------------------
引用 8 楼 daman7 的回复:
引用 3 楼 net_java_dram 的回复:

可以这样做

一个大类(菜单类有你的5个菜单类的集合,这样就可以做到返回类型都是 “菜单” 类型 )
public class 菜单
{
private list<菜单一> list菜单一
public list<菜单一> List菜单一
get{ return list菜单一}
set{list菜单一=value}

……


5个菜单都一样的属性 那就更简单了啊...实体携带的数据不同而已,也就是在数据库取的数据不同而已啊... --------------------编程问答--------------------
引用 9 楼 net_java_dram 的回复:
5个菜单都一样的属性 那就更简单了啊...实体携带的数据不同而已,也就是在数据库取的数据不同而已啊...


确实如此 不知你有什么好办法

你的意思是共用一个实体类吗? --------------------编程问答-------------------- 既然属性一样 就是一个实体了啊...取不同的数据 加载菜单就可以了 --------------------编程问答-------------------- 建一个commons类  包含共用代码 --------------------编程问答-------------------- --------------------编程问答--------------------
引用 11 楼 net_java_dram 的回复:
既然属性一样 就是一个实体了啊...取不同的数据 加载菜单就可以了

不太敢这样搞 怕后患无穷啊 --------------------编程问答--------------------
引用 12 楼 z365949298 的回复:
建一个commons类  包含共用代码

请详细说下哪些代码 谢谢 --------------------编程问答-------------------- 简单列一下你现在的写法,帮你看下怎么抽象 --------------------编程问答--------------------
引用 16 楼 sandy945 的回复:
简单列一下你现在的写法,帮你看下怎么抽象


--------------------编程问答-------------------- 用泛型
<T>
T t.方法 --------------------编程问答-------------------- 就是5个实体类 暂时命名为 a1~a5 继承自一个实体基类 直接继承了一下 里面没代码 只不过改了下名字

基类  2个属性 id name 实现 IComparable接口 还有一个
public override string ToString()
        {
            return this.Name;
        }


实体就是这样 这些表有些还是很复杂的 但我只取两列就行了 用来完成那个表单的选项

ADL层对应的也是5个类
分别有读取数据库来创建
List<a1> 
List<a2> 
List<a3> 
...
的方法

我一个表对应两种实体 
一种是完整版 一种是这样只取两列的(不知道这样好不好) 
当然查询 修改 杂七杂八的方法在DAL层里还不少

BLL层 只是简单封装 还是5个类 因为是一个表对应一个类 所以一个类里不止一个方法
都和DAL对应的有些还有点简单的完整性约束之类的业务逻辑

到了界面 从List<>内容转到Combobox里
还是类似代码复制了5份 

我已经复制完了 能用了 不过觉得不太对劲

我想要个思路


--------------------编程问答-------------------- 你这样说没帮助的。 你可以将你的代码相关部分提取出来上传,然后把下载地址贴在这。

有人有时间的话,会下载帮你设计的。  --------------------编程问答-------------------- 难道就是所谓的封装,继承嘛? --------------------编程问答-------------------- 不知道你想问什么,更不知道你怎么会去纠结什么数据读取、工厂之类的概念了。既然是在表现层遇到了有需要复用的组件,那么就学一点开发控件的知识,除此之外你还能够怎样去掉重复?

如果给那些“从来不用控件”的人看来,这个问题越纠结越好。他们只想说“一遍一遍重复低级的代码才能学到底层技术”,而根本不会花时间去学技术去把重复代码封装起来复用、发布给别人使用。 --------------------编程问答-------------------- 你需要去读一读TextBox、ComboBox等的源代码,学会基本的控件开发技术,然后继承ComboBox而开发自己的扩展ComboBox控件。 --------------------编程问答-------------------- 使用Object返回,再强制转换 --------------------编程问答-------------------- --------------------编程问答-------------------- 看了又看,想了又想,还是那样 --------------------编程问答--------------------
引用 26 楼 wmingcsharp 的回复:
看了又看,想了又想,还是那样

还是哪样 是不是就该从头到尾复制粘贴啊 --------------------编程问答-------------------- --------------------编程问答--------------------
LZ 还在这个问题上纠结哦  --------------------编程问答-------------------- 也不叫纠结啦 学习中 --------------------编程问答-------------------- 呵呵 难道大家平时没遇到过这种问题吗 我觉得这种表结构还是蛮常见的呀 就2列 --------------------编程问答-------------------- 建议你多看看别人的代码或者下个动软用吧,用的同时多体会人家的设计思想 --------------------编程问答-------------------- --------------------编程问答-------------------- 为了三层而三层,本身就不可取。所以普通应用我从来不用三层(基本就是查询数据库,显示,搞三层有毛用),不过经常被人指指点点,说不规范,太原始,连三层架构都没有用,比较无语 --------------------编程问答--------------------
引用 34 楼 spbdev 的回复:
为了三层而三层,本身就不可取。所以普通应用我从来不用三层(基本就是查询数据库,显示,搞三层有毛用),不过经常被人指指点点,说不规范,太原始,连三层架构都没有用,比较无语

也不叫为了..而..
前人总结的经验是有道理的
业务逻辑比较少的情况下 业务逻辑层确实有点累赘 比如我现在的情况 但是也是没办法啊

引用 33 楼 ylwhlgg 的回复:
建议你多看看别人的代码或者下个动软用吧,用的同时多体会人家的设计思想

目前根据33L的指示 继续学习中 --------------------编程问答-------------------- 楼主历害哦,果断接分 --------------------编程问答-------------------- 泛型, 反射 --------------------编程问答-------------------- 送你两个字:重构 --------------------编程问答-------------------- --------------------编程问答--------------------
引用 38 楼 xinyaping 的回复:
送你两个字:重构

可以的呀 给个方向啊 --------------------编程问答--------------------
引用 23 楼 sp1234 的回复:
你需要去读一读TextBox、ComboBox等的源代码,学会基本的控件开发技术,然后继承ComboBox而开发自己的扩展ComboBox控件。


源代码哪里有啊? --------------------编程问答-------------------- 用泛型和反射吧 --------------------编程问答-------------------- 用通用存储过程呗,BLL就少很多代码了。 --------------------编程问答-------------------- 你需要的是<<设计模式>>和<<重构>>这两本书,他会解决你的这类问题. --------------------编程问答-------------------- 一个类: DAL的,根据一个ID从数据库取得 NAME数组
一个类:BLL的,传一个ID给DAL取得 NAME数组
一个类:VI的,根据控件ID,传相应ID给BLL取得NAME数组给控件.
比如
switch 根据cbx.name 或者cbx.tag 返回相应的ID.
那么cbx.DataSource =BLL(VI(cbx.name)); --------------------编程问答-------------------- 什么样的ID返回什么样的数组是BLL做的.

比如BLL里写:

if(ID=="我是省份")返回数组1
if(ID=="我是市")返回数组2 --------------------编程问答-------------------- --------------------编程问答-------------------- <<大话设计模式>>可以阅读阅读
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,