【发布时间】:2017-03-03 01:28:36
【问题描述】:
从纯计算机科学(或者可能是计算语言学)的角度来看,我想知道这两个词之间的区别:
- 装饰器
- 属性
- 方面
- 特性
各种语言以不同的方式利用这些词和功能。例如,在 Python 中,装饰器 [根据 Python Wiki](强调我的):
装饰器动态改变函数、方法或类的功能,而无需直接使用子类或更改被装饰函数的源代码。
这让我觉得它与 PostSharp 或 DynamicProxy 等面向方面的编程工具非常相似。即:
[Profile]
private static void SleepSync()
{
Thread.Sleep(200);
}
在 C# 和 Java(以及无数其他语言)中,属性可以表示装饰器模式 (C#) 或字段 (Java)。
在 C++ 中通过 boost 或 PhP 通过内置 trait 词,我们可以使用 trait 来扩展类,如下所示:https://en.wikipedia.org/wiki/Trait_(computer_programming)
那么,从“纯粹”的角度来看,所有这些实际上是什么的规范定义是什么?有没有更好的方法来定义它们?
【问题讨论】:
-
语言之间没有标准。另外,我认为并非所有语言都支持每种语言的严格定义。以 Java 为例。 Decorator = Annotation,Attribute = Field,Trait = Default method(可能是接口)...另一方面,Aspect 更像是一个软件架构概念,而不是任何一种语言的特性。
-
按理说,这些关联的“事物”中的每一个都有一个范式级别的“术语”。我很难从理论的角度相信你无法准确地量化它们。
-
您真正需要在编程语言之间切换多久才能需要讨论概念而不是语言的实际术语? Trait 和 Aspect 的维基百科页面似乎足以让我从高层次上理解。 (参考:en.m.wikipedia.org/wiki/Aspect_(computer_programming))但是,如果你说的是 Python,我说的是 C#,我们都说装饰器,那么我们的理解可能不同。
-
我不确定这有什么关系。问题是关于理论和计算机科学的。但答案很常见。我在不同的技术上处理了很多不同的问题。
-
@MichaelScheper 注释不会直接修改行为或添加新行为,而装饰器则可以。注释可能会间接改变行为,但注释基本上只是元数据,是关于类的额外信息。
标签: computer-science decorator theory traits aspect