一起来看看大道至简的一些基本设计思想,首先我们来看一下什么是封装。
封装:也叫做信息隐藏,或者数据访问保护。放到程序上来讲,就是隐藏类的属性,还有实现细节,仅对外公开一些接口。那么外部,就只能通过这个类暴露的这些访问接口,按照这个类提供的方式来访问类的内部信息或者数据。这样子的一种情况就叫做封装。
作为做Java的我们来讲,封装,我们是非常非常熟悉的,因为一开始学Java,学面向对象,就会讲封装、继承和多态。
接下来,我们就来谈一谈,到底面向对象当中封装的本质是什么。其实从字面意义上理解封装,就是把什么东西包装起来,进一步说就是一个封装体。事实上大家想,面向对象当中,类是不是就是一个封装体?
大家想想,类里面封装的什么呢?无外乎就是一些属性,就是一些数据,然后是方法,其实可以代表它的功能。
也就说一个类,它就是封装了一定功能的这么一个封装体。
当然,封装并不仅仅只是对一个类而言,你可以扩大一点,以此类推,从设计的角度来看:一个组件是不是一个封装?只不过它封装的,不再是属性、方法,它里头封装的就是一个一个的,其它组件或者模块,或者是类。
以此类推,组件是一个封装体,那模块是不是一个封装体? 子系统是不是一个封装体?系统是不是还是一个封装体?
只是范围大小不同而已,所以大家会发现,封装是咱们做架构设计一个非常非常基础的、非常重要的思想。
咱们再从另外一个角度来看一看,类,它其实是代码功能的一个封装,或者说是一个聚合方式。
没有面向对象之前,咱们叫做面向过程设计,或者叫过程化设计。大家可以理解成是这样,这里面有一堆的代码,我们称之为函数,或者说是一些过程。
在过程化设计里面,这些功能都是比较散乱的堆放在一起,也就说每一个功能只管自己,跟其它功能没有什么联系。但后来大家觉得,这样子去摆放代码非常的不友好。要想找一个功能,尤其是带流程的,那就在里头跳来跳去,非常的乱。
大家就想到一个办法:把相关的一些功能,比方说发现这里的功能是相关的,都是用来做,比方说用户数据的管理。我们就可以把这个东西封装起来,然后就演化成,可以用一个类来封装这些东西,就开始面向对象设计了。
这些功能都是相关的,都是用户这个对象应该要实现的功能,也就说从代码的角度,也能够感觉得到,面向对象设计实际上就是把原来这些过程化设计当中,杂乱无章的这些函数或者是功能,按照一定的方式重新进行组织,把它们封装到一起。所以说呢,从某种意上说,类是代码的一种聚合方式。
咱们一个完整的软件系统,就是由大大小小的,各种不同的这种封装体聚合起来的。就好比说一个大的软件系统,又分成了很多的子系统,这个子系统其实也是一种封装。
这个子系统又包含另外的子系统,每个子系统里面可能有很多的模块或者是组件,这些组件里面又有很多具体的功能,也就是它封装的是一定的功能。 这不就是大大小小的封装,最终合起来就是你的这个系统。
所以说大家要从架构设计的眼光来看待这些问题。你看一个大的软件系统不就是大大小小的各种各样的封装体吗?至于这里头到底封装的是什么。这个东西就看你怎么划分了,直到最后落实到具体的功能上。
从设计上来讲,到底封装什么呢?对于每一个封装体来说,主要就是为了把核心业务部分,或者是核心功能部分封装起来。那么这么封装起来有什么样的好处呢?也就是为什么要封装呢?
大家想想,当你把这些核心功能封装起来过后,首先对核心功能是一个安全保护。另外呢,也是为了复用这些核心的功能,除了这些呢,把这包装起来的目的,是为了可修改,可维护,可扩展。
有些人说,怎么还会可修改可维护呢?很简单,你把这些功能封装在这个,比方说椭圆里面封装了一堆的功能,事实上,这内部的功能和外部是不是就分开了?你封装的这些功能是不是就可以单独的进行修改,进行维护,并且进行扩展。
只要对外提供的接口不发生变化,那你封装起来的这一块,是不是就可以随便改了。所以说呢,从某种意义上来说,也是封装了变化。
当你觉得这一块以后可能会变,就可以把这块先包装起来,那么以后的变化,就可以在封装体内来实现,而不会影响到外部。当然这个了,跟咱们接下去要讲的一个思想:隔离,是息息相关的,或者是有类似之处的。总之呢,大家会发现封装对我们来讲,是一个非常非常重要的思想,我们一定要重视对他的理解。
为了大家更好的交流架构设计的思想和知识,大家可以加sishuok,拉你进架构设计群,一起共同学习,共同进步。
我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数
目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称
项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU
我在我的项目中有一个用户和一个管理员角色。我使用Devise创建了身份验证。在我的管理员角色中,我没有任何确认。在我的用户模型中,我有以下内容:devise:database_authenticatable,:confirmable,:recoverable,:rememberable,:trackable,:validatable,:timeoutable,:registerable#Setupaccessible(orprotected)attributesforyourmodelattr_accessible:email,:username,:prename,:surname,:
我是一名决定学习Ruby和RubyonRails的ASP.NETMVC开发人员。我已经有所了解并在RoR上创建了一个网站。在ASP.NETMVC上开发,我一直使用三层架构:数据层、业务层和UI(或表示)层。尝试在RubyonRails应用程序中使用这种方法,我发现没有关于它的信息(或者也许我只是找不到它?)。也许有人可以建议我如何在RubyonRails上创建或使用三层架构?附言我使用ruby1.9.3和RubyonRails3.2.3。 最佳答案 我建议在制作RoR应用程序时遵循RubyonRails(RoR)风格。Rails
我正在尝试创建密码规则来设计可恢复的密码更改。我通过passwords_controller.rb做了一个父类(superclass),但我需要在应用规则之前检查用户角色,但我所拥有的只是reset_password_token。 最佳答案 假设您的模型是用户:User.with_reset_password_token(your_token_here)Source 关于ruby-on-rails-设计通过reset_password_token获取用户,我们在StackOverflow
我已经使用Apartment设置了一个Rails5应用程序(1.2.0)和Devise(4.2.0)。由于某些DDNS问题,应用只能在app.myapp.com下访问(请注意子域app)。myapp.com重定向到app.myapp.com。我的用例是每个注册该应用的用户(租户)都应该通过他们的子域(例如tenant.myapp.com)访问他们的特定数据。用户不应限定在其子域内。基本上应该可以从任何子域登录。重定向到租户的正确子域由ApplicationController处理。根据Devise标准,登录页面位于app.myapp.com/users/sign_in。这就是问题开始的
我在关注RyanbatesRailsCast的devise和omniauth(第235集-devise-and-omniauth-revised)。当我尝试使用Twitter登录时,标题中不断出现错误。defself.new_with_session(params,session)ifsession["devise.user_attributes"]new(session["devise.user_attributes"],without_protection:true)do|user|user.attributes=paramsuser.valid?end完整跟踪:C:/Ruby20
我为Devise用户和管理员提供了不同的模型。我也在使用Basecamp风格的子域。除了我需要能够以用户或管理员身份进行身份验证的一些Controller和操作外,一切都运行良好。目前我有authenticate_user!在我的application_controller.rb中设置,对于那些只有管理员才能访问的Controller和操作,我使用skip_before_filter跳过它。不幸的是,我不能简单地指定每个Controller的身份验证要求,因为我仍然需要一些Controller和操作才能被用户或管理员访问。我尝试了一些方法都无济于事。看来,如果我移动authentica