總感覺項目組寫的代碼不規(guī)范,有時一個類能有幾千行代碼。那么應(yīng)該如何規(guī)范代碼那?
領(lǐng)域特定語言的目標(biāo)是主要關(guān)注我們應(yīng)該做什么,而不是怎樣去實現(xiàn)某種特定的業(yè)務(wù)邏輯。
Linq簡化了代碼
如果使用c#開發(fā)則對應(yīng)的領(lǐng)域特定語言就是Linq技術(shù)了。
這是個表示分組的對象,用于保存分類的名稱和產(chǎn)品數(shù)量。然后我們就會寫一些十分丑陋的代碼
DSL是對模型的一個有益的補(bǔ)充。
Dictionary《string, Grouping》 groups = new Dictionary《string, Grouping》();
foreach (Product p in products)
{
if (p.UnitPrice 》= 20)
{
if (!groups.ContainsKey(p.CategoryName))
{
Grouping r = new Grouping();
r.CategoryName = p.CategoryName;
r.ProductCount = 0;
groups[p.CategoryName] = r;
}
groups[p.CategoryName].ProductCount++;
}
}
List《Grouping》 result = new List《Grouping》(groups.Values);
result.Sort(delegate(Grouping x, Grouping y)
{
return
x.ProductCount 》 y.ProductCount ? -1 :
x.ProductCount 《 y.ProductCount ? 1 :
0;
});
不過如果這里我們使用DSL,也就是LINQ,就像這樣:
var result = products
.Where(p =》 p.UnitPrice 》= 20)
.GroupBy(p =》 p.CategoryName)
.OrderByDescending(g =》 g.Count())
.Select(g =》 new { CategoryName = g.Key, ProductCount = g.Count() });
方法鏈
其實我們在C#代碼中除了Linq,其他地方也可以做類似的設(shè)計,學(xué)名叫方法鏈(Method chaining),類型如下實現(xiàn):
Object.DoSomething().DoSomethingElse().DoAnotherThing();
class Person
{
private string _name;
private byte _age;
public Person SetName(string name)
{
_name = name;
return this;
}
public Person SetAge(byte age)
{
_age = age;
return this;
}
public Person Introduce()
{
Console.WriteLine(“Hello my name is {0} and I am {1} years old.”, _name, _age);
return this;
}
}
//Usage:
static void Main()
{
Person user = new Person();
// Output of this sequence will be: Hello my name is Peter and I am 21 years old.
user.SetName(“Peter”).SetAge(21).Introduce();
}
評論
查看更多