代码之家  ›  专栏  ›  技术社区  ›  Lyubomyr Shaydariv

语言集成设计模式

  •  0
  • Lyubomyr Shaydariv  · 技术社区  · 16 年前

    我注意到,初学者很难开始设计模式。理解设计模式结构需要很多时间。将设计模式应用到实践中也需要很多时间。同意,如果你不熟悉不同类型的设计模式,你就不会第一次看到它们之间的区别。如果您的类具有适当的名称,那么这个问题将部分解决。此外,如果您偶然错过了一些编写代码的规则,或者您对设计模式没有那么丰富的经验,那么您也可以破坏您实现的设计模式类结构。编译器可以保护您并帮助您实现接口——如果您不实现接口,则无法编译应用程序。这是一个好的、安全的方法。如果编译器也可以在实现设计模式类时保护您?很多编程语言都支持“foreach”语句。编程语言是否可以为工厂、桥梁、代理、纪念品等提供支持?如果可能是真的,您可以使用以下类似的方法来应用抽象和具体的工厂模式(我更喜欢使用C作为伪代码的基础语言;假定使用上下文关键字):

    public abstract factory class AF {
        public product AP1 GetProduct1();
        public product AP2 GetProduct2();
    };
    
    public concrete factory class CF1 : AF {
        public product CP1 GetProduct1() { ... }
        public product CP2 GetProduct2() { ... }
    };
    

    它认为它可以帮助您理解新的源代码并保持应用程序源代码结构的完整性。你觉得这个怎么样?

    3 回复  |  直到 13 年前
        1
  •  5
  •   Ben James    16 年前

    如果我理解您所说的话,您认为新的语言特性应该能够克服通常与实现设计模式相关联的样板代码的需求。

    这已经发生了,并不是什么新鲜事。

    以单例模式为例,它是最著名的模式之一。每个人都知道如何实现它:您声明构造函数 private ,将对象的单个全局实例作为 static 属性,并添加 public 方法来检索它。

    对于概念上非常简单的东西,这是相当多的代码行。

    在scala中,不需要任何样板文件来创建单例。以补充 class 关键字,scala有一个 object 关键字,它声明一个singleton对象:

    object MainApp {
      def main(args: Array[String]) {
        println("Hello, world!")
      }
    }
    

    在运行时,将有一个 MainApp . 不需要使用 new ;事实上,你不能使用 new MainApp 完全。

        2
  •  1
  •   MHarris    16 年前

    有一种观点认为,语言中设计模式的存在表明语言本身的设计存在缺陷,下一代语言应该从上一代常见的设计模式中学习。

    例如,请参见Peter Norvigs famous presentation 关于动态语言中不可见的设计模式。

    事实上,很容易想到这个过程已经发生的例子——如您所说,foreach循环可以说是嵌入的迭代器,ruby有一个singleton mixin来继承,任何具有多方法的语言都不需要访问者模式。groovy有内置的构建器。

    你工厂的具体例子听起来有点像 Noop 将依赖注入集成到语言规范中。

    当然,只有到目前为止,类型检查程序才能保证代码的正确性(目前)。而且,将设计模式嵌入到语言中并不能免除对核心概念的熟悉,或者对手头问题的应用进行认真考虑的需要。

    你的例子很有趣,你建议在语言中添加几个关键词和规则(我不太熟悉C),这对语言没有明显的好处。“工厂”关键字会告诉类型检查器(或另一个程序员)从声明“AF”等价于Java接口,并将“产品”作为其方法的返回类型吗?

        3
  •  0
  •   Marcel Valdez Orozco    13 年前

    我想你在做什么。但是你忽略了一点(在我看来),那就是你试图指定一个设计模式,正如Mharris所说,随着时间的推移,这些模式往往会变得不受欢迎或过时,使得依赖于它们的语言不是一个好主意。

    我认为,可能有一种“复合”语言,其中有两个工件:设计规范语言(与实现语言耦合,不要认为是UML)和实现。举个例子,可以这样做:

    设计规范:

    single public Factory
        methods:
            T Get[T]
    

    注意,如果这样做,因为设计规范是抽象的(不需要在那里指定低级的细节,然后),所以它可以有便于编写规范的构造。知道在规范中,您不需要说方法是公共的还是私有的,设计规范(不包括算法伪代码)只关心公开可见的行为,而不关心私有的实现细节。

    实施:

    public class ConcreteFactory : Factory {
        public Product1 GetProduct1() { ... }
        public Product2 GetProduct2() { ... }
    };
    

    这里可以使用两种方法:

    1. 编译器可以将设计作为工件,然后检查实现代码是否与之一致。
    2. 编译器或运行时可以提供可自动生成的部分实现(如singleton实现),代码本身可以假定为singleton,不需要重新指定,例如:

      等级混凝土工厂:工厂{

        Product1 GetProduct1 { new ConcreteProduct1 }  
      
        Product2 GetProduct2 { new ConcreteProduct2 }  
      

      }

    请注意,实现可以忽略更高级别的内容,比如类的可见性和方法的可见性,因为这已经在设计级别(dry)指定了。如果你问我,这种类型的语言也必须有一个专门的IDE,以便提供关于类型设计的上下文信息。正如JeffAtwood所评论的,任何新语言都应该有其专门的IDE。

    推荐文章