我目前正在尝试学习Ruby,并且我正在尝试更多地了解它在封装和合同方面提供的内容.
在C#中,可以使用接口定义合同.实现接口的类必须通过为每个定义的方法和属性(以及可能的其他内容)提供实现来满足合同中的条款.实现接口的单个类可以在合同定义的方法范围内执行任何需要,只要它接受相同类型的参数并返回相同类型的结果.
有没有办法在Ruby中强制执行此类操作?
谢谢
我在C#中的一个简单例子:
Run Code Online (Sandbox Code Playgroud)interface IConsole { int MaxControllers {get;} void PlayGame(IGame game); } class Xbox360 : IConsole { public int MaxControllers { get { return 4; } } public void PlayGame(IGame game) { InsertDisc(game); NavigateToMenuItem(); Click(); } } class NES : IConsole { public int MaxControllers { get { return 2; } } public void PlayGame(IGame game) { InsertCartridge(game); TurnOn(); } }
我阅读了Steve Freeman和Nat Pryce 的测试指导下的面向对象的软件,并给我留下了深刻的印象.我想在使用RSpec的Rails项目中采用本书的思想,尽管它的例子是用Java编写的.
本书的基本原则是我们应该模拟接口而不是具体的类.他们说我们可以通过提取接口并命名它们来改进应用程序设计.
但是,Ruby没有任何与Java相同的语法interface.我如何利用他们的技术进行Rails项目?
UPDATE
例如,在页面126中,作者引入了Auction接口以实现该bid方法.首先,他们嘲笑Auction.class让测试通过,然后他们在Auction类中实现了一个类作为匿名内部Main类.最后,他们XMPPAuction从Main(第131-132页)中提取了一个新的具体类.
在我看来,这种增量方法是本书的关键.
如何在Ruby开发中采用或模仿这样一系列代码转换?
我正在寻求有关设计模式的帮助.我非常习惯java中的接口,我不知道如何在ruby中获得类似的机制.它需要的是一种具有接触方法的接口.为了获得联系我需要打电话给api,这可能是google,linkedid或任何web服务.所以我想使用一个界面,它为我提供了联系方式,我不想知道任何关于提供者的信息.
我的第一次尝试看起来像这样(伪代码):
Module AbstractContact
def contacts
#do some stuff with @data
@data
end
end
class Impl
include AbstractContact
def build_provider(provider)
if provider == :google
#get the data from google
gdata= api_call
@data = gdata
elsif provider == :linkedin
end
end
end
c=Impl.new
c.build_provider
c.contacts
Run Code Online (Sandbox Code Playgroud)
但我真的不确定,如果这是"红宝石的方式".
欢迎提供帮助,建议和建议.最好,菲尔
我的代码看起来像这样:
obj.foo(); // obj might, or might not have a `foo` method.
Run Code Online (Sandbox Code Playgroud)
我想知道是否可以覆盖obj.foo在我的代码中调用时发生的事情,例如:
obj.foo = function(){ alert ("Hello"); });
obj.onCallNonExistentMethod = function(){ // I know this is imaginary syntax
alert("World");
}
obj.foo(); // alerts "Hello"
delete obj.foo;
obj.foo(); // alerts "World" , would TypeError without the method missing handler.
Run Code Online (Sandbox Code Playgroud)
据我所知,在Ruby中可能是method_missing或const_missing类似的东西.
我可以覆盖在JavaScript中调用不存在的对象方法时发生的事情吗?如果可以,我该怎么办?
目标是验证我提供给用户的API,以便他们可以安全地使用API,我可以更清楚地警告他们错误.