如何更改我现有的代码,使其更具扩展性?

熬夜程序猴 2015-11-21 02:05:24
需求:通过使用不同模块号(MODULE)和功能号(FUNC)及数据生成不同的数据包
现有代码如下:

namespace Builder
{
/*
* 需求:通过使用不同模块号(MODULE)和功能号(FUNC)及数据
* 生成不同的数据包
*/
/// <summary>
/// 模块号
/// </summary>
public enum MODULE { MODULE1, MODULE2, MODULE3, MODULE4 }
/// <summary>
/// 功能号
/// </summary>
public enum FUNCTION { FUNC1, FUNC2, FUNC3, FUNC4 }

/// <summary>
/// 生成器接口
/// </summary>
public interface IBuilder
{
Object Generate();
}
/// <summary>
/// 数据生成器
/// </summary>
public abstract class DataBuilder : IBuilder
{
protected MODULE M = MODULE.MODULE1;
protected FUNCTION F = FUNCTION.FUNC1;
protected string Datas = string.Empty;
public DataBuilder(MODULE m, FUNCTION f, string datas)
{
M = m;
F = f;
Datas = datas;
}
/// <summary>
/// 构建 -- 抽象成员函数
/// </summary>
/// <returns></returns>
protected abstract Object Build();

#region IBuilder 成员
public object Generate()
{
return this.Build();
}
#endregion

}

// MOUDLE1 生成器
namespace MODULE1
{
/// <summary>
/// FUNCTION1 生成器
/// </summary>
public class DataBuilder1 : DataBuilder
{
public DataBuilder1(MODULE m, FUNCTION f, string datas)
: base(m, f, datas)
{
}
protected override object Build()
{
return M.ToString() + " " + F.ToString() + " " + Datas;
}
}
/// <summary>
/// FUNCTION2 生成器
/// </summary>
public class DataBuilder2 : DataBuilder
{
public DataBuilder2(MODULE m, FUNCTION f, string datas)
: base(m, f, datas)
{
}
protected override object Build()
{
return M.ToString() + " " + F.ToString() + " " + Datas;
}
}

public class DataBuilder3 : DataBuilder
{
public DataBuilder3(MODULE m, FUNCTION f, string datas)
: base(m, f, datas)
{
}
protected override object Build()
{
return M.ToString() + " " + F.ToString() + " " + Datas;
}
}

public class DataBuilder4 : DataBuilder
{
public DataBuilder4(MODULE m, FUNCTION f, string datas)
: base(m, f, datas)
{
}
protected override object Build()
{
return M.ToString() + " " + F.ToString() + " " + Datas;
}
}
}
// MODULE2 生成器
namespace MODULE2
{
public class DataBuilder1 : DataBuilder
{
public DataBuilder1(MODULE m, FUNCTION f, string datas)
: base(m, f, datas)
{
}
protected override object Build()
{
return M.ToString() + " " + F.ToString() + " " + Datas;
}
}

public class DataBuilder2 : DataBuilder
{
public DataBuilder2(MODULE m, FUNCTION f, string datas)
: base(m, f, datas)
{
}
protected override object Build()
{
return M.ToString() + " " + F.ToString() + " " + Datas;
}
}

public class DataBuilder3 : DataBuilder
{
public DataBuilder3(MODULE m, FUNCTION f, string datas)
: base(m, f, datas)
{
}
protected override object Build()
{
return M.ToString() + " " + F.ToString() + " " + Datas;
}
}

public class DataBuilder4 : DataBuilder
{
public DataBuilder4(MODULE m, FUNCTION f, string datas)
: base(m, f, datas)
{
}
protected override object Build()
{
return M.ToString() + " " + F.ToString() + " " + Datas;
}
}
}

namespace MODULE3
{
.....
.....
.....
.....
}

namespace MODULE4
{
.....
.....
.....
.....
}
/// <summary>
/// 生成器上下文
/// </summary>
public static class BuilderContext
{
private static IBuilder GetBuilder(MODULE m, FUNCTION f, string datas)
{
IBuilder builder = null;
switch (m)
{
case MODULE.MODULE1:
switch (f)
{
case FUNCTION.FUNC1:
builder = new MODULE1.DataBuilder1(m, f, datas);
break;
case FUNCTION.FUNC2:
builder = new MODULE1.DataBuilder2(m, f, datas);
break;
case FUNCTION.FUNC3:
builder = new MODULE1.DataBuilder3(m, f, datas);
break;
case FUNCTION.FUNC4:
builder = new MODULE1.DataBuilder4(m, f, datas);
break;
default:
break;
}
break;
case MODULE.MODULE2:
switch (f)
{
case FUNCTION.FUNC1:
builder = new MODULE2.DataBuilder1(m, f, datas);
break;
case FUNCTION.FUNC2:
builder = new MODULE2.DataBuilder2(m, f, datas);
break;
case FUNCTION.FUNC3:
builder = new MODULE2.DataBuilder3(m, f, datas);
break;
case FUNCTION.FUNC4:
builder = new MODULE2.DataBuilder4(m, f, datas);
break;
default:
break;
}
break;
case MODULE.MODULE3:
.......
.......
.......
break;
case MODULE.MODULE4:
.......
.......
.......
break;
default:
break;
}
return builder;
}

public static object GetBuildData(MODULE m, FUNCTION f, string datas)
{
IBuilder builder = GetBuilder(m, f, datas);
if (null != builder)
{
return builder.Generate();
}

return builder;
}
}
/* 调用示例:
class Program
{
static void Main(string[] args)
{
object datas = BuilderContext.GetBuildData(MODULE.MODULE1, FUNCTION.FUNC2, "Hello world!");

Console.WriteLine(datas);

Console.ReadKey();
}
}
*/
}
...全文
206 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
attilax 2019-08-08
  • 打赏
  • 举报
回复
Atitit 提升扩展性指标与方法总结 目录 1. 扩展性常见指标 1 1.1. 代码简洁,应业务变动调整修改少 1 1.2. 免编译 1 1.3. 是否支持热部署 1 2. 常见的方法策略 2 2.1. 尽可能转移提升语言级别到4gl 2 2.2. 语言的代际级别关系表 2 2.3. 内嵌解释器 表达式解释器等 2 2.4. 尽可能配置化动态化 2 2.5. Scheme less Scheme free模式 多使用弱类型结构json等 2 2.6. 对于编译类型语言,多使用map等动态结构 2 2.7. 中间层通道化 驱动化 3 2.8. 无中心节点,避免庞大组件出现 3 3. 其他一些扩展性方法 3 4. 提升可读性 3 4.1. 本地化 3 4.2. Dsl 自然语言化 3 4.3. 控制转移法 比如查表法代替if else判断 3 1.扩展性常见指标 1.1.代码简洁,应业务变动调整修改少 1.2.免编译 尽可能做到业务功能变动,代码调整,无需编译。。避免了带来的打包与热部署问题 1.3.是否支持热部署 调整代码无需重启服务器服务程序 2.常见的方法策略 2.1.尽可能转移提升语言级别到4gl 语言级别越高,可读性越高,代码越简洁 语言的趋势也是趋向于免编译,动态性,可读性等 2.2.语言的代际级别关系表 语言代际与级别 具体常见语言 备注 5gl 自然语言等 进展很大,但还不大成熟。。 4gl Sql h5 xml 3.5g Script系列 js 等 3gl Java c#等需要编译的语言 2.3.内嵌解释器 表达式解释器等 Ongl express等 js解释器等 2.4.尽可能配置化动态化 2.5.Scheme less Scheme free模式 多使用弱类型结构json等 常见的弱类型结构还有H5 xml等 2.6.对于编译类型语言,多使用map等动态结构 Ui收集参数可使用request的map结构。。与后端orm工具交互参数也是map 等 2.7.中间层通道化 驱动化 2.8.无中心节点,避免庞大组件出现 3. 其他一些扩展性方法 针对静态语言,可以使用些泛型、抽象类、接口等方法 适当使用写 设计模式 适当抽象 产品化 为“普罗大众”去设计,而不是为“个例”设计 4.提升可读性 4.1.本地化 4.2.Dsl 自然语言化 4.3.控制转移法 比如查表法代替if else判断 Atitit 项目高扩展法.docx
南天空 2015-11-23
  • 打赏
  • 举报
回复
这种感觉比较符合抽象工厂模式的应用条件,楼主参考一下看看。既然每种数据包的构成方式都是一样的,当然是将数据和构造包分别做成类,将成品的包做成字典,调用的时候直接通过键值对调用字典,有扩展的时候也方便。(最好是数据类做成接口,构造包类做成静态类,少用枚举类型)
熬夜程序猴 2015-11-22
  • 打赏
  • 举报
回复
引用 5 楼 starfd 的回复:
GetBuilder内部用反射
能否给出一点指导?我的代码已经可以运行,只要注释掉代码中带...号的行就可以编译,能否帮忙改一下?
熬夜程序猴 2015-11-22
  • 打赏
  • 举报
回复
引用 6 楼 sbwwkmyd 的回复:
看起来都一样啊
return M.ToString() + " " + F.ToString() + " " + Datas;
M、F、Datas都是变量好不?? 在示例中 改变 GetBuilderData()的参数,就变了:

class Program
    {
        static void Main(string[] args)
        {
            object datas = BuilderContext.GetBuildData(MODULE.MODULE1, FUNCTION.FUNC2, "Hello world!");
 
            Console.WriteLine(datas);
 
            Console.ReadKey();
        }
    }
熬夜程序猴 2015-11-22
  • 打赏
  • 举报
回复
能否通过GOF 实现类BuilderContext中 switch的精简,BuilderContext.GetBuilder()函数 在以后模块号或功能号增加时,扩展非常的麻烦,如果不停的增加模块和功能,GetBuilder中的switch将会变的无比的长。。。。。
Poopaye 2015-11-22
  • 打赏
  • 举报
回复
引用 11 楼 XinChiMaker 的回复:
[quote=引用 10 楼 shingoscar 的回复:] 总算看懂了 FUNCTION最好改一下,这样反射更方便
public enum FUNCTION { DataBuilder1, DataBuilder2, ...}
Type t = Type.GetType(m.ToString() + "." + f.ToString());
DataBuilder builder = (DataBuilder)Activator.CreateInstance(t, m, f, datas);
首先 感谢你的回复! 可能还是我没有把意思表达明白,我在一楼所说的模块号和功能号并不是程序代码的模块和功能 实际是一种基于串口通信的协议,协议类似如下: A (帧头)+ 模块命令(m)+ 功能命令(f)+自定义数据域(datas)+B(帧尾) 随着后续硬件功能的扩展,PC端的软件也将更跟随协议作出扩展。[/quote] 是你没明白 按照你7楼所说,无非是想通过m,f拿到对应的DataBuilder,不是吗?
熬夜程序猴 2015-11-22
  • 打赏
  • 举报
回复
协议如图:
熬夜程序猴 2015-11-22
  • 打赏
  • 举报
回复
引用 10 楼 shingoscar 的回复:
总算看懂了 FUNCTION最好改一下,这样反射更方便
public enum FUNCTION { DataBuilder1, DataBuilder2, ...}
Type t = Type.GetType(m.ToString() + "." + f.ToString());
DataBuilder builder = (DataBuilder)Activator.CreateInstance(t, m, f, datas);
首先 感谢你的回复! 可能还是我没有把意思表达明白,我在一楼所说的模块号和功能号并不是程序代码的模块和功能 实际是一种基于串口通信的协议,协议类似如下: A (帧头)+ 模块命令(m)+ 功能命令(f)+自定义数据域(datas)+B(帧尾) 随着后续硬件功能的扩展,PC端的软件也将更跟随协议作出扩展。
Poopaye 2015-11-22
  • 打赏
  • 举报
回复
总算看懂了 FUNCTION最好改一下,这样反射更方便
public enum FUNCTION { DataBuilder1, DataBuilder2, ...}
Type t = Type.GetType(m.ToString() + "." + f.ToString());
DataBuilder builder = (DataBuilder)Activator.CreateInstance(t, m, f, datas);
showjim 2015-11-21
  • 打赏
  • 举报
回复
看起来都一样啊
return M.ToString() + " " + F.ToString() + " " + Datas;
  • 打赏
  • 举报
回复
GetBuilder内部用反射
cheng2005 2015-11-21
  • 打赏
  • 举报
回复
强类型你没办法动态生成。如果采用动态编译的话,那调用方要如何调用呢?所以可以采用字典,索引的方式做属性和值的对应,这样才能实现扩展。
cheng2005 2015-11-21
  • 打赏
  • 举报
回复
强类型你没办法动态生成。如果采用动态编译的话,那调用方要如何调用呢?所以可以采用字典,索引的方式做属性和值的对应,这样才能实现扩展。
Poopaye 2015-11-21
  • 打赏
  • 举报
回复
应该是没人能看懂你想表达什么
熬夜程序猴 2015-11-21
  • 打赏
  • 举报
回复
连点都没有人点啊 ,自己顶上去

110,535

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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