目录
介绍
规格类型
模块
没有模块开发
模块化编程
谓词和类型
契约
类型化编程
接口和抽象
其他语言的签名
软件设计提升了一系列编程质量:
一些目标:
模块化有助于拥有可扩展、可修改、可移植、可维护、可重用、易懂和灵活的软件。它允许在需要时无缝添加新功能,并删除不需要的功能,从而简化面向用户的软件视图。它允许多个开发人员同时处理不同的模块。它还允许独立测试模块。此外,大型项目变得更容易监控和控制。
C#,如C,Java和其他编程语言允许通过不同方式创建模块化软件。在本文中,我们将通过C#中的接口简要探讨模块化软件开发。
代码规格可能采用不同的形式:
这里出现了验证问题:如何检查规格?
以下是接口/类型规格:
public interface ISet{
ISet Add(ISet s, T e);
ISet Remove(ISet s, T e);
ISet Empty();
bool IsEmpty(ISet s);
bool Find(ISet s, T e);
int Length(ISet s);
}
以下是正式规格:
IsEmpty(Empty()) = true
IsEmpty(Add(s, e)) = false
Find(Empty(), e) = false
Find(Add(s, e), e) = true
Find(Add(s, e), e) = Find(s, e)
Add(s, e) = s [if Find(s, e) = true]
[unconstrained otherwise]
Remove(Empty(), e) = Empty()
Remove(Add(s, e), e) = s
Remove(Add(s, e), f) = Add(Remove(s, f), e)
模块是表示代码单元(类型,值,函数和语言允许的任何表达式)并满足以下条件的构造:
模块集应根据其接口引起的依赖关系连接:
许多编程语言提供的模块仅适用于这些属性的子集:
在下面的文章中,我们将研究C#在模块方面的能力。
所有代码都写在一个单元中,几乎没有规格。
以下是一个例子:
public T[] Empty(){
return new T[]{};
}
public bool IsEmpty(T[] s){
return s.Length == 0;
}
public T[] Add(T[] s, T e){
var l = new List(s);
l.Add(e);
return l.ToArray();
}
public T[] Remove(T[] s, T e){
var l = new List(s);
l.Remove(e);
return l.ToArray();
}
public bool Find(T[] s, T e){
return s.Contains(e);
}
public int Length(T[] s){
return s.Length;
}
有利的特点:
问题:
模块化编程将代码分解为一组内聚和松散耦合的模块,这些模块应根据规格进行组合。
接口/实现类的关系类似于模块/签名。
以下是接口/类型规格:
public interface ISet{
ISet Add(ISet s, T e);
ISet Remove(ISet s, T e);
ISet Empty();
bool IsEmpty(ISet s);
bool Find(ISet s, T e);
int Length(ISet s);
}
以下是客户端模块:
public class MySet:ISet{
public ISet Add(ISet s, T e) { /* ... */ }
public ISet Remove(ISet s, T e) { /* ... */ }
public ISet Empty() { /* ... */ }
public bool IsEmpty(ISet s) { /* ... */ }
public bool Find(ISet s, T e) { /* ... */ }
public int Length(ISet s) { /* ... */ }
}
以下是测试模块:
public class MySetTest{
public void AddTest() { /* ... */ }
public void RemoveTest() { /* ... */ }
public void EmptyTest() { /* ... */ }
public void IsEmptyTest() { /* ... */ }
public void FindTest() { /* ... */ }
public void LengthTest() { /* ... */ }
}
好处:
类型是语言值的子集。例如:bool 类型是集合{ true,false}。
谓词是一个取任何可能值并返回布尔值的函数:
在C#中,根据官方文档,契约提供了一种为代码指定前置条件,后置条件和对象不变量的方法。前提条件是输入方法或属性时必须满足的要求。后置条件描述了方法或属性代码退出时的期望。对象不变量描述处于良好状态的类的预期状态。
代码契约包括用于标记代码的类,用于编译时分析的静态分析器和运行时分析器。代码契约的类可以在System.Diagnostics.Contracts命名空间中找到。
代码契约的好处包括:
类型系统是应用于程序的形式方法,其旨在用类型对程序的元素进行分类,以保证其行为的某些正确性。
根据语言及其编译器,类型系统可能有不同的风格:
好处:
抽象数据类型是:
Java中的接口:
interface Set{
Set add(Set set, T e);
Set remove(Set set, T e);
Set empty();
boolean is_empty(Set set);
boolean find(Set set, T e);
int length(Set set);
}
OCaml中的签名:
module type SET = sig
type ’a set
val add : ’a set → ’a → ’a set
val remove : ’a set → ’a → ’a set
val empty : unit → ’a set
val is_empty : ’a set → bool
val find : ’a set → ’a → bool
val length : ’a set → int
end
原文地址:https://www.codeproject.com/Articles/5163072/Modular-Software-Development-In-Csharp