首页 / 软件开发 / C# / Effective C#原则24:选择申明式编程而不是命令式编程
Effective C#原则24:选择申明式编程而不是命令式编程2010-12-11 博客园 Wu.Country@侠缘译与命令式编程相比,申明式编程可以用更简单,更清楚的方法来描述软件的 行为。申明式编程就是说用申明来定义程序的行为,而不是写一些指令。在C#里 ,也和其它大多数语言一样,你的大多数程序都是命令式的:在程序中写一个方 法来定义行为。在C#中,你在编程时使用特性就是申明式。你添加一个特性 到类,属性,数据成员,或者是方法上,然后.Net运行时就会为你添加一些行为 。这样申明的目的就是简单易用,而且易于阅读和维护。让我们以一个 你已经使用过的例子开始。当你写你的第一个ASP.Net Web服务时,向导会生成 这样的代码:[WebMethod]
public string HelloWorld()
{
return "Hello World";
}
VS.net的Web服务向导添加了[WebMethod]特性到HelloWorld()方 法上,这就定义了HelloWorld是一个web方法。ASP.net运行时会为你生成代码来 响应这个特性。运行时生成的Web服务描述语言(WSDL)文档,也就是包含了对 SOAP进行描述的文档,调用HelloWorld方法。ASP.net也支持运行时发送SOAP请 求HelloWorld方法。另外,ASP.net运行时动态的生成HTML面页,这样可以让你 在IE里测试你的新Web服务。而这些全部是前面的WebMethod特性所响应的。这个 特性申明了你的意图,而且运行时确保它是被支持的。使用特性省了你不少时间 ,而且错误也少了。这并不是一个神话,ASP.net运行时使用反射来断定 类里的哪些方法是web服务,当它们发现这些方法时,ASP.net运行时就添加一些 必须的框架代码到这些方法上,从而使任何添加了这些代码的方法成为web方法 。[WebMethod] 特性只是.Net类库众多特性之一,这些特性可能帮助你 更快的创建正确的程序。有一些特性帮助你创建序列化类型(参见原则25)。正如 你在原则4里看到的,特性可以控制条件编译。在这种情况以下其它一些情况下 ,你可以使用申明式编程写出你所要的更快,更少错误的代码。你应该 使用.Net框架里自带的一些特性来申明你的意图,这比你自己写要好。因为这样 花的时间少,更简单,而且编译器也不会出现错误。如果预置的特性不 适合你的需求,你也可以通过定义自己的特性和使用反射来使用申明式编程结构 。做为一个例子,你可以创建一个特性,然而关联到代码上,让用户可以使用这 个特性来创建默认可以排序的类型。一个例子演示了如何添加这个特性,该特性 定义了你想如何在一个客户集合中排序:[DefaultSort( "Name" )]
public class Customer
{
public string Name
{
get { return _name; }
set { _name = value; }
}
public decimal CurrentBalance
{
get { return _balance; }
}
public decimal AccountValue
{
get
{
return calculateValueOfAccount();
}
}
}
DefaultSort特性,Nane属性,这就暗示了任何Customer的集合 应该以客户名字进行排序。DefaultSort特性不是.Net框架的一部份,为了实现 它,你创建一个DefaultSortAttribute类:[AttributeUsage( AttributeTargets.Class |
AttributeTargets.Struct )]
public class DefaultSortAttribute : System.Attribute
{
private string _name;
public string Name
{
get { return _name; }
set { _name = value; }
}
public DefaultSortAttribute( string name )
{
_name = name;
}
}