我觉得编程本质上来源于生活,编程相关的一些知识和经验如果深入分析一下,会发现多数可能就是对生活现象的抽象再抽象。刚开始接触编程的时候,我还没有这种感觉。后来经过几年的学习和体验,我渐渐对编程有了一点自己的理解。
既然提到编程,如果只是空洞的谈可能会有些模糊,既不方便理解也不方便叙述。那就拿我比较熟悉的一门语言开始切入吧,Java。提到Java就不得不提到面向对象,面向对象可以说是面向过程的升级版或者说是扩展版,只要是写程序就离不开顺序、分支(选择)和循环。本质上讲两种思想的底层都是依靠这三个词而堆积起来的一行行代码,但是往深了考虑两种思想有不同的特点。
关于面向对象和面向过程,我举一个简单的例子,比如你想吃鱼香肉丝这道菜,那么你可能需要先去买食材,买完食材要进行初步加工,之后经过一个个工序才可以吃到这道菜。那么这个方式就可以理解为面向过程,我们都知道生活里还有另一种方式,你可以不自己做而直接去饭店点菜,你只需要报一个菜名就可以吃到你想吃的菜,这个方式就类似面向对象。
从生活和编程的关系来看,编程之所以能快速发展而且由它带来的东西能出现在生活的方方面面并很好的为我们服务。我的理解是因为它本就是和生活为一体,从面向过程到面向对象,(再次用一下那个例子)为了更快更好的解决吃到某道菜的问题才出现了饭店,那么饭店或者说饭店里的每一道菜就可以理解为不同的对象。从生活角度来看,面向对象的思想可能更具有普适性,它的功能是大还是小这是根据实际情况和实际效果来评判的,而且它也是因为要解决生活里的问题才出现的。其实生活里依然有一些场景是需要面向过程的,比如一些机器里的嵌入式程序等等。我们再来看一下这个例子,饭店里的菜从顾客的角度看是面向对象,因为顾客只需要说菜名就可以了,但是对于厨师来说每一道菜又同时是面向过程的,因为厨师同样的要完成买食材,清理食材等等一系列步骤才能做好这道菜。编程是用来解决问题的,不论是编程思想还是编程语言、不管是层出不穷的框架还是一个个新的技术,它们都是从生活场景中来,到生活场景中去。
面向过程是一种以”过程“为中心的编程思想,它首先分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,在使用时依次调用,是一种基础的顺序的思维方式。面向对象是一种以“对象”为中心的编程思想,把要解决的问题分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个对象在整个解决问题的步骤中的属性和行为。
面向过程关注每个步骤之间的先后关系,面向对象则是把类似的相近的关联性强的一些步骤进行抽象聚合,使其成为一个个对象,然后去考虑对象和对象之间的关联,这样的思维更适合解决更大更复杂的问题,也更容易实现‘’’高内聚低耦合“的软件设计目标。这一特点让面向对象在实际应用中有了更强的适应性,在增加新的功能的时候,可以在原有的基础上进行扩展而不用去改变原有的内部的细节,这对迭代开发是非常友好的。面向对象最关键的思想就是抽象,对象或者说类都是抽象的产物,通过抽象可以让关联关系很轻松的结合也可以很轻松的解开,新增和删除关联关系也就变的相对简单。
还有我们熟知的软件设计模式,比如代理模式、外观模式、适配器模式等等都可以在生活中找到对应的场景,其实本质上来说,这些设计模式就是从生活里的某些场景中抽象而来,它们的存在就是为了更好地解决现实生活存在的问题。所以我觉得编程其实是很朴素的,它本身就和生活密不可分,而由它产生的一系列产品也对我们的生活影响巨大。
很喜欢黑格尔的一句话:凡是合理的就是现实的,凡是现实的就是合理的。编程因生活而起又因生活而发展,生活因为有了编程而出现了很大的进步,同时它的变化又督促着编程技术的发展。编程需要应用,只有在应用中的思考和提升才是最直接有效的,应用是编程发展源源不断的动力,编程和生活相辅相成、不断进步。技术本身在应用中会得到高速的发展,而就我们个人而言,学习一种新思想或者一门新技术,也同样需要在实际应用中得到提升,这既是压力也是动力,在这个过程中会收获最独特的经验和教训。
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
在控制台中反复尝试之后,我想到了这种方法,可以按发生日期对类似activerecord的(Mongoid)对象进行分组。我不确定这是完成此任务的最佳方法,但它确实有效。有没有人有更好的建议,或者这是一个很好的方法?#eventsisanarrayofactiverecord-likeobjectsthatincludeatimeattributeevents.map{|event|#converteventsarrayintoanarrayofhasheswiththedayofthemonthandtheevent{:number=>event.time.day,:event=>ev
我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返
我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss
好的,所以我的目标是轻松地将一些数据保存到磁盘以备后用。您如何简单地写入然后读取一个对象?所以如果我有一个简单的类classCattr_accessor:a,:bdefinitialize(a,b)@a,@b=a,bendend所以如果我从中非常快地制作一个objobj=C.new("foo","bar")#justgaveitsomerandomvalues然后我可以把它变成一个kindaidstring=obj.to_s#whichreturns""我终于可以将此字符串打印到文件或其他内容中。我的问题是,我该如何再次将这个id变回一个对象?我知道我可以自己挑选信息并制作一个接受该信
它不等于主线程的binding,这个toplevel作用域是什么?此作用域与主线程中的binding有何不同?>ruby-e'putsTOPLEVEL_BINDING===binding'false 最佳答案 事实是,TOPLEVEL_BINDING始终引用Binding的预定义全局实例,而Kernel#binding创建的新实例>Binding每次封装当前执行上下文。在顶层,它们都包含相同的绑定(bind),但它们不是同一个对象,您无法使用==或===测试它们的绑定(bind)相等性。putsTOPLEVEL_BINDINGput