OOP原则(如果有的话)在动态类型环境中不适用或应用不同,而不是静态类型环境(例如Ruby vs C#)?这不是对静态与动态辩论的呼吁,而是我想看看是否存在适用于一方而非另一方适用于该范围的任何一方的公认原则,或者采用不同的方式.在"静态类型"OOP文献中,诸如"喜欢组合到继承"的短语是众所周知的.它们是否适用于动态方面?
例如,在动态类型环境中,似乎耦合的粒度不会超过方法的级别.换句话说,任何给定的函数调用只将调用者耦合到任何类可能满足的特定接口- 或者换句话说,任何像那个特定的鸭子那样嘎嘎叫的东西.
另一方面,在Java中,耦合的粒度可以与包一样高.一个特定的方法调用不仅与另一个类/接口建立契约,而且还将它耦合到该类/接口的package/jar/assembly中.
像这样的差异会产生不同的原则和模式吗?如果是这样,这些差异是否明确表达了?Ruby Pickaxe书中有一节向这个方向发展(Duck Typing/Classes Are Types),但我想知道是否还有其他内容.我知道Ruby中的设计模式,但还没有读过它.
编辑 - 有人认为Liskov在动态环境中并不像在静态环境中那样应用它,但我不禁想到它确实如此.一方面,没有与全班同学的高级合同.但是,不是所有对任何特定类别的调用构成一个隐含的契约,需要像Liskov所规定的那样由子类来满足吗?考虑以下."做一些酒吧"的电话会创建一个需要由子课程来处理的合同.这不是"将专门对象视为基类吗?"的情况:
class Bartender
def initialize(bar)
@bar = bar
end
def do_some_bar_stuff
@bar.open
@bar.tend
@bar.close
end
end
class Bar
def open
# open the doors, turn on the lights
end
def tend
# tend the bar
end
def close
#clean the bathrooms
end
end
class BoringSportsBar < Bar
def open
# turn on Golden Tee, fire …Run Code Online (Sandbox Code Playgroud) oop design-patterns static-typing dynamic-typing static-language
罗伯特哈珀写了一篇名为"动态语言是静态语言"的迷人作品.在其中他写道:
这正是动态类型语言的错误:它们不是提供忽略类型的自由,而是强加了将注意力限制在单一类型上的束缚!每个值都必须是该类型的值,您别无选择!
这已经成为单类型语言.(单一语言).
现在Clojure 声称是一种动态语言:
Clojure是一种动态编程语言,面向Java虚拟机(以及CLR和JavaScript).它旨在成为一种通用语言,将脚本语言的可接近性和交互式开发与用于多线程编程的高效且强大的基础结构相结合.Clojure是一种编译语言 - 它直接编译为JVM字节码,但仍然是完全动态的.Clojure支持的每个功能都在运行时受支持.
"动态"意味着"可以在运行时与之交互",而不是"没有类型".
现在静态和动态之间的关键区别似乎是"我可以在编译时遇到类型失败吗?"
如果我写下面的Clojure代码:
(deftype circle-type [radius] )
(deftype square-type [side-length])
(defn def-check-type [new-symbol-type existing-symbol]
(let [existing-symbol-type (type existing-symbol)]
(cond
(= new-symbol-type existing-symbol-type)
(def new-symbol existing-symbol)
:else (str "types didn't match: " new-symbol-type " : " existing-symbol-type))))
(println (def-check-type circle-type (square-type. 2)));)
Run Code Online (Sandbox Code Playgroud)
然后在Leiningen中编译它:
lein uberjar
Run Code Online (Sandbox Code Playgroud)
然后我得到以下内容:
$ lein uberjar
Compiling clojure-unittyped.core
types didn't match: class clojure_unittyped.core.circle-type : class clojure_unittyped.core.square-type
Run Code Online (Sandbox Code Playgroud)
在动态语言中,这似乎是编译时的类型失败.
我的问题是:Clojure …
任何人都可以解释有关动态类型或静态类型语言的C C++ Java.
我在某处读到C C++和Java都是静态语言.但我记得还有其他意见.非常困惑.
谢谢!
假设您可以获得动态解释器; 静态编译语言可以替换脚本语言吗?我完全不明白为什么有人会使用脚本语言?我在谈论PC,而不是一个需要简单解释器的有限系统.我看到了一些python安装脚本,并看到了类似的python和C#解决问题的方法.那么为什么要使用脚本语言呢?
注意:有些事情让我对C#感到烦恼,我不是在问为什么不用C#代替.我在问为什么要使用脚本语言?我发现静态编译语言更容易调试,并且通常更容易编码.