[原]实例-简单设计&精简代码&复用代码
引言
独立的Model层数据类型

适度封装以简化代码

public bool Compile(BGProject project, out String errorMessage)
{
TextCompiler textCompiler = new TextCompiler(project);
ImageCompiler imageCompiler = new ImageCompiler(project);
XxxCompiler xxxCompiler = new XxxCompiler(project); foreach (CompilerBase compiler in
new CompilerBase[] {textCompiler, imageCompiler, XxxCompiler})
{
compiler.Compile();
if (!compiler.Validate(out errorMessage))
{
return false;
}
} // ...
}
Don't Repeat Yourself 复用代码
protected static void TravelElements<T>(BGProject project, BGElementType elementType, Action<T> action)
where T : BGElement
{
foreach (BGDiagram diagram in project.Diagrams)
{
foreach (T element in
diagram.Elements.Where(e => e.ElementType == elementType))
{
action(element);
}
}
}
TravelElements<BGTextElement>(Project, BGElementType.Text,
element =>
{
//.... 针对目标元素做相应处理
});
处理该特定问题,这里使用委托的方式,泛型化使其易于使用,你也可以使用TemplateMethod模式
合宜地使用静态类型封装基本工具类型
序列化工具类
项目中涉及数据序列化到本地文件,直接使用如下工具类型
public static class SerializeUtility
{
public static void BinarySave<T>(String filePath, T obj)
{
using (Stream stream = new FileStream(filePath, FileMode.Create, FileAccess.Write, FileShare.None))
{
IFormatter formatter = new BinaryFormatter();
formatter.Serialize(stream, obj);
}
} public static T BinaryLoad<T>(String filePath)
{
return BinaryLoad<T>(filePath, null);
} public static T BinaryLoad<T>(String filePath, SerializationBinder serializationBinder)
{
if (!File.Exists(filePath))
{
return default(T);
} using (Stream stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.None))
{
IFormatter formatter = new BinaryFormatter();
if (serializationBinder != null)
{
formatter.Binder = serializationBinder;
}
return (T)formatter.Deserialize(stream);
}
}
}
int与byte数组转换工具类
涉及到传输数据至下位机,考虑数据存储格式,编写如下工具类,支持littleEnding与bigEnding
// Created by Ant 2014-4-30
public static class BytesConverterUtility
{
public static byte[] GetBytes(int value, int length, bool isLittleEndian = true)
{
if (value < )
{
throw new ArgumentException("value不能为负数");
} if (length > )
{
throw new ArgumentException("length不能>4");
} var rawBytes = BitConverter.GetBytes(value); if (rawBytes.Length < length)
{
throw new ApplicationException(
String.Format("BitConverter.GetBytes返回的字符数{0}小于目标字符数{1}", rawBytes.Length, length));
} var bytes = new byte[length]; if (BitConverter.IsLittleEndian != isLittleEndian)
{
Array.Reverse(rawBytes);
Array.Copy(rawBytes, rawBytes.Length - length,
bytes, , length);
}
else
{
Array.Copy(rawBytes, bytes, length);
} return bytes;
} public static int ToInt(byte[] bytes, int offset, int length, bool isLittleEndian = true)
{
if (length == )
{
return bytes[offset];
} var tempBytes = new byte[length]; Array.Copy(bytes, offset, tempBytes, , length); if (!isLittleEndian)
{
Array.Reverse(tempBytes);
} switch (length)
{
case :
// 特殊处理,转换为无符号int类型,返回时自动转换为Int32
return BitConverter.ToUInt16(tempBytes, );
case :
// 注意,这里将数据转换为有符号int类型
return BitConverter.ToInt32(tempBytes, );
default:
throw new ArgumentException("length 长度非标准值");
}
}
}
工具类型的方便之处在于其独立性,几乎无外部依赖,不需要考虑对其进行初始化,拿来就可以直接使用
[原]实例-简单设计&精简代码&复用代码的更多相关文章
- 3.NetDh框架之缓存操作类和二次开发模式简单设计(附源码和示例代码)
前言 NetDh框架适用于C/S.B/S的服务端框架,可用于项目开发和学习.目前包含以下四个模块 1.数据库操作层封装Dapper,支持多种数据库类型.多库实例,简单强大: 此部分具体说明可参考博客: ...
- 通过游戏学python 3.6 第一季 第九章 实例项目 猜数字游戏--核心代码--猜测次数--随机函数和屏蔽错误代码--优化代码及注释--简单账号密码登陆--账号的注册查询和密码的找回修改--锁定账号--锁定次数--菜单功能'menufile
通过游戏学python 3.6 第一季 第九章 实例项目 猜数字游戏--核心代码--猜测次数--随机函数和屏蔽错误代码--优化代码及注释--简单账号密码登陆--账号的注册查询和密码的找回修改--锁 ...
- 通过游戏学python 3.6 第一季 第八章 实例项目 猜数字游戏--核心代码--猜测次数--随机函数和屏蔽错误代码--优化代码及注释--简单账号密码登陆--账号的注册查询和密码的找回修改--锁定账号--锁定次数
通过游戏学python 3.6 第一季 第八章 实例项目 猜数字游戏--核心代码--猜测次数--随机函数和屏蔽错误代码--优化代码及注释--简单账号密码登陆--账号的注册查询和密码的找回修改--锁定账 ...
- C# 求精简用一行代码完成的多项判断 重复赋值
C# 求精简用一行代码完成的多项判断 重复赋值 哈哈,说实话,个人看着这么长的三元操作也麻烦,但是我也只想到了这样三元判断句中执行方法体能够写到一行,追求的终极目的是,用一行实现这个过程,而且简单,由 ...
- python面向对象入门(1):从代码复用开始
本文从代码复用的角度一步一步演示如何从python普通代码进化到面向对象,并通过代码去解释一些面向对象的理论.所以,本文前面的内容都是非面向对象的语法实现方式,只有在最结尾才给出了面向对象的简单语法介 ...
- 函数和代码复用 --Python
1.关于递归函数的描述,以下选项中正确的是 A.包含一个循环结构 B.函数比较复杂 C.函数内部包含对本函数的再次调用 D.函数名称作为返回值 答案:D 答案解析:递归函数是指函数内部包含对本函数的再 ...
- Python-函数和代码复用
函数的定义与使用 >函数的理解与定义 函数是一段代码的表示 -函数是一段具有特定功能的.可重用的语句组 -函数是一种功能的抽象,一般函数表达特定功能 -两个作用:降低编程难度 和 代码复用 de ...
- 6个实例详解如何把if-else代码重构成高质量代码
本文提纲: 为什么我们写的代码都是if-else?这样的代码有什么缺点?是否有优化的方法?如何重构?异常逻辑处理型重构方法状态处理型重构方法为什么我们写的代码都是if-else?程序员想必都经历过这样 ...
- Python学习笔记(五)函数和代码复用
函数能提高应用的模块性,和代码的重复利用率.在很多高级语言中,都可以使用函数实现多种功能.在之前的学习中,相信你已经知道Python提供了许多内建函数,比如print().同样,你也可以自己创建函数, ...
随机推荐
- OpenStack with Opendaylight Part 1: Intro to Pipeline
Using Vagrant to create vm nodes; devstack to start openstack using Opendaylight as ML2. Openstack w ...
- 使用roboware创建工作空间
1.打开终端,启动roboware软件: $roboware-studio 2.在欢迎使用的页面点新建工作区,工作区的名字建议写为:catkin_ws,路径放在home文件夹或者任意你想放的文件夹中. ...
- 字符串(string+StringBuilder) +正则表达式元字符
创建字符串: System.String(string是这个类的别名) System.Text.StringBuilder System.String类: 1,创建字符串 string s = &qu ...
- WebServers 异步
在网上也找了一些,发现要么题目和内容不对应,明明是在Winform下异步调用,却写成在Asp.net异步调用WebService,有的调用方式在.NET3.5下不能通过,.NET3.5下取消了Begi ...
- windows7安装PyQt5(通过pip install 安装)
开始接触PyQt5 ,总结了一下安装的方法 默认各位已经安装好了Python环境 首先,确定一下之前没有安装过pyqt5,如果安装了,可以先卸载,避免出现意外, 之前装了几次没成功就是这种情况,卸载命 ...
- SecureCrt 连接Redhat linux
1.Vmware虚机设置网络模式为桥接Bridge.保证linux中能ping通windows,windows中也能ping通linux. 2.修改sshd_config文件,命令为:vi /etc/ ...
- Codeforces Round #281 (Div. 2) A. Vasya and Football(模拟)
简单题,却犯了两个错误导致WA了多次. 第一是程序容错性不好,没有考虑到输入数据中可能给实际已经罚下场的人再来牌,这种情况在system测试数据里是有的... 二是chronologically这个词 ...
- mysql中事务隔离级别可重复读说明
mysql中InnoDB引擎默认为可重复读的(REPEATABLE READ).修改隔离级别的方法,你可以在my.inf文件的[mysqld]中配置: transaction-isolation = ...
- UVA - 10934 Dropping water balloons (dp,逆向思维)
题目链接 题目大意:给你n个规格一样的气球和一栋大楼的高度,求最少试验几次能测出气球最高在哪一层掉下来不破. 如果这道题想用(dp[i][j]=用i个气球测出j高度的楼需要几次)来作为状态的话,那你就 ...
- Gym - 100623J Just Too Lucky (数位dp)
给定n∈[1,1e12],求1到n的所有整数中,各位数字之和能整除它本身的数的个数. 这道题与UVA-11361类似,假如设dp[u][lim][m1][m2]为枚举到第u位(从低到高数),是否受限, ...