Computer science 支持和反对名称等价和结构等价的论点是什么?
在语言设计界,曾经有一场关于语言应该使用还是不应该使用的长期争论。像ALGOL、ML或Modula-3这样的语言使用结构等价,而。。。大多数编程语言都使用命名等价(包括Modula-2)Computer science 支持和反对名称等价和结构等价的论点是什么?,computer-science,language-design,type-equivalence,Computer Science,Language Design,Type Equivalence,在语言设计界,曾经有一场关于语言应该使用还是不应该使用的长期争论。像ALGOL、ML或Modula-3这样的语言使用结构等价,而。。。大多数编程语言都使用命名等价(包括Modula-2) 支持结构对等的典型论点是什么?反对它的典型论点是什么?支持名称等效的典型论据是什么?与之相反的典型论点是什么?我认为结构类型系统的优势在于,它们鼓励您创建面向接口用户需求的细粒度接口,而不是面向实现者提供的接口 在命名类型系统中,您需要对接口具有公共依赖关系。在结构类型系统中,这种需求被消除了:您可以构建一个松
支持结构对等的典型论点是什么?反对它的典型论点是什么?支持名称等效的典型论据是什么?与之相反的典型论点是什么?我认为结构类型系统的优势在于,它们鼓励您创建面向接口用户需求的细粒度接口,而不是面向实现者提供的接口 在命名类型系统中,您需要对接口具有公共依赖关系。在结构类型系统中,这种需求被消除了:您可以构建一个松散耦合的系统,而无需创建一个公共库,在其中放置所有接口。每个客户端都可以独立地声明它期望从协作者处获得的接口 结构类型系统的缺点是,它们将类与接口相匹配,而接口可能无法真正实现正确的契约。例如,如果您有此接口:
public interface IBananaProvider
{
/// Returns a banana, never null.
Banana GetBanana();
}
然后,将隐式地考虑以下类在结构类型系统中实现ibanaaprovider
。但是,该类违反了post条件,即返回的香蕉从不为null:
public class SomeBananaProvider
{
// returns a banana or null if we're all out
public Banana GetBanana()
{
if (bananas.Count > 0)
{
return bananas.RemoveLast();
}
else
{
return null;
}
}
}
如果合同以某种方式被正式指定,并被视为类型结构的一部分,则这一点可以得到解决。我认为事情正在朝这个方向发展,例如在.NET 4.0中。支持严格名称等价的一个很好的论据(例如在Ada中可用)是,它使编译器有可能拒绝意外混合不同单位的代码,例如厘米和英寸,或摄氏度和华氏度 在具有严格名称等价性的语言中,可以有两种类型
type celsius based on float;
type fahrenheit based on float;
var c : celsius; var f : fahrenheit;
c := f; /* compile time error: incompatible types */
而在一种失去名称对等和结构对等的语言中
type celsius is float;
type fahrenheit is float;
c := f; /* no error and no warning here */
。。。根据应用程序和系统的类型,最终会出现错误计算,从而导致不可预测的行为,这可能导致严重的财务损失甚至死亡。如果没有严格的名称对等,这样的逻辑错误也很难找到。维基百科链接:这告诉我它们是什么。我已经知道这一点,作为一个用户,很多语言都使用这两种语言的变体。那些网页没有告诉我的是,有什么论据是用来支持双方,推翻另一方的。是的,我只是为那些不知道问题是什么的读者提供了链接。也许我应该改为编辑这个问题。啊,这是有道理的。我将自己编辑这个问题。为了澄清起见:结构等价的优点与duck类型的优点类似,但是需要实现完整的接口,所以灵活性较低,但更可能正确地键入?我不理解你的意思“需要实现完整的接口,因此灵活性较低.Structural typing允许您为每个协作者定义绝对最小接口,而实现者不需要知道所有这些最小接口。因此我想说的是相反的:结构类型消除了实现无用接口成员的需要,因为每个必需的成员都是客户端实际使用的成员。在duck类型中,如果我有一个包含元素A和B的“接口”,并且我知道它的给定用户只访问A,我可以传递一个“实现者”只提供一个(比如说,一个用于测试的模拟对象)的接口的类型——只在使用点检查“类型”,并且只检查正在使用的特定元素。在Modula-3(一种结构等价语言)中,我不能这样做。编译器静态地检查结构的等价性,因此即使我知道这个特定的客户端(或其中的一部分)只使用该子集,我也不能传入提供功能子集的内容。这里的问题是类型系统的问题,即对象引用本质上是可为空的,和/或第二,除了“属于类型A”之外,没有粒度,所以你是说NASA更喜欢严格的名称等效至于美国宇航局,有一个前往金星的任务,由于公里和英里的混合,飞船丢失了。如果该软件是用一种具有严格名称等价性的语言编写的,那么是的,事实上,这个错误会在编译时被捕获。