松本行弘的程序世界 6 Ruby On Rails

MVC和Ruby On Rails

MVC是设计GUI程序的设计模式之一。大部分设计模式仅决定程序某一部分的构成,而MVC决定了应用程序的整体部分,有时候也被成为架构模式。

模型、视图和控制的作用

模型:是表现窗口中表示内容(信息)的对象。模型代表的只是信息(名字、数值等抽象的信息),它不能包含如何来显示这些信息的信息。
视图:代表将模型中包含的信息在窗口中进行表示的对象。视图知道要表现的模型的信息,而模型一般不知道要表示自己的视图信息。
控制:是从用户端接受输入,对视图和模型进行操作的对象。

屏幕快照 2018-07-11 上午9.26.46
屏幕快照 2018-07-11 上午9.26.46

用秒表的例子来学习MVC模式

生成视图和控制部分

GUI工具箱与MVC

同时使用工具箱和MVC

MVC的优缺点

优点:

可以更换界面

一个模型对应多个视图

多个视图可以同时响应

容易测试

缺点:

复杂性

强关联性

对模型对象进行了功能追加这样的变更后,相应地也必须对视图和控制进行变更。

Web应用中的MVC

Web应用基本是HTTP。HTTP的一次处理经过了一下过程:
(1)Web浏览器对应于用户的操作,向Web服务器发出HTTP请求。
(2)Web服务器根据请求,准备好发送到Web浏览器的数据。
(3)Web服务器把数据以HTTP响应的形式送还Web浏览器。

利用MVC来描述:
(1)Web浏览器发送过来的HTTP请求通过Web服务器传给控制部分。Web应用框架的分配器把请求传递给合适的控制部分。
(2)控制部分操作的模型和请求的信息相对应,同时制定显示使用的视图。视图从模型启动,一边引用模型一边准备发送给Web浏览器的数据。
(3)Web服务器把数据以HTTP响应的形式送还Web浏览器。

屏幕快照 2018-07-11 上午9.54.09
屏幕快照 2018-07-11 上午9.54.09

Ruby on Rails上的MVC各部分功能稍有不同。Rails中的模型相当于数据库层,视图指显示用的模板,控制器指控制用的类(包含了应用逻辑)。

屏幕快照 2018-07-11 上午9.56.48
屏幕快照 2018-07-11 上午9.56.48

开放类和猴子补丁

猴子补丁,即在动态语言中,不改变源代码而对功能进行追加和变更。
现在灵活使用开放类,变更和追加方法全部称为猴子补丁。

开放类

Ruby的类的特征是所谓的开放类,相对于其他语言,特别容易打猴子补丁。
Ruby中,可以把String类、Array类等基本的数据类型及所有的类都作为开放类处理,可以自由地追加功能。

猴子补丁的目的

功能追加

利用开放类可以给已有的类追加功能。

功能变更

修改程序错误

因为重新定义了有程序错误或有副作用的方法,不用修改原来那部分的代码就可以解决问题。这也是本来的猴子补丁的目的。

钩子

有时间想在每个方法调用的同时增加一些其他处理。这种伴随方法调用而进行的处理称为“钩子”(hook),钩子的追加也可以用猴子补丁来实现。

缓存(cache)

猴子补丁的技巧

可以吧Ruby提供的对方法、类和模块进行操作的功能运用到打猴子补丁上。最基本的功能就是给已有的方法改名或取消。

屏幕快照 2018-07-11 上午10.58.20
屏幕快照 2018-07-11 上午10.58.20

undef

undef有把方法取消定义的功能。用undef不仅可以取消本类中的方法,也可以取消父类中定义的方法。

alias

include

灵活使用开放类的库

jcode库可以不使用正则表达式,利用开放类的功能,使得字符串的方法可以处理多字节文字。

猴子补丁的几点问题

若要正确使用开放类,安全地打猴子补丁,需遵守:

  1. 基本上只是追加功能
    对类追加新方法不会让已有的程序无法执行。使用开放类时,主要做不容易导致问题的功能追加会更保险。做功能追加时,如果发生名称重复会造成麻烦,在选择追加的方法名时需要慎重。
  2. 进行功能变更时要慎重,尽可能小规模
  3. 小心相互作用

其他方法

猴子补丁能够不改变源代码进行动态修改,这种灵活性是显示动态语言柔软性和扩展性的好例子。实现猴子补丁的Ruby开放类有时功能过强,可能会引起问题。
其他语言中用更易控制的形式也能实现猴子补丁。

Ruby on Rails和开放类

Rails构成部分之一ActiveSupport库。ActiveSupport利用Ruby的开放类功能,对Ruby标准提供的类大胆地追加了功能。

ActiveSupport带来的扩展

  1. 时间
  2. 字节单位系列
  3. 复数形和序数

大规模开发和Ruby

编译时不作类型检查

Ruby在执行时作类型检查,大规模程序为了保证可靠性一定会有严格的测试程序,如果作了严格的测试,在编译时作类型检查的优点就不像所说的那么重要了。

没有包

Java对于构成库的类和文件有独立的包,要想具备某种功能,必须明确地进行import操作。而Ruby是不具备这种功能的。所以,库定义的类和模块名是全局的,从任何地方都可以引用。因此,可以说名称重复的危险性很大。

存在开放类

各自独立的库发生互相矛盾的变更时,问题不能简单解决。这也可能在大规模开发时引发问题。

信赖性模型

在某种类型的大规模开发中,Ruby的性质会造成问题,或者说造成问题时解决起来不像其他语言那么容易,这种现象是现实中可能存在的。如果认为这些是问题的话,可能不使用Ruby会更好。但是,到现在为止我们看到的情况表明,会发生那种问题的大规模开发本来就绝不是好的开发状况。首先要做的,是把项目的信赖关系改善到可以使用Ruby的程度。就算是最后也没有使用Ruby,这也是应该先做到的事情。

猴子补丁的未来

猴子补丁虽然有一定的危险性,但有利有弊,它也提供了方便性、扩展性和灵活性。开放类和利用它的猴子补丁,将来也可能会被更安全的、由1特定目的而特制的功能群而替代。