有没有荒岛求生的电影既有计算机系又有医药系的大学啊?求推荐啊

403 Forbidden
403 Forbidden
You don't have permission to access the URL on this server. Sorry for the inconvenience.
Please report this message and include the following information to us.
Thank you very much!
/gongsi/383929/
Powered by Tengine10月16日开始
10月13日截止
11月1日-30日
正在报名中
建筑学院创新:模拟现场施工实操班,动画演示、独创辅导体系...
233网校10周年站庆领红包,500万现金红包... 进行中
热门考试直达
提前备战2016年一级建造师考试
零基础双师资vip班
2016年安全工程师考试备战升级
注册消防工程师vip火热报名
注册物业管理师vip班全面招生
监理工程师VIP班火热招生
会计证3科签约VIP方案
初级会计双师资无纸化模考
中级会计师 1次通关新选择
银行从业资格 VIP班1年取证
名师助您备考2015经济师考试
2016注册会计师无忧取证班重磅招生
热门考试直达1/3
2015证券从业VIP班考前冲刺
教师资格统考VIP班火热报名
期货从业核心考点备考VIP提分方案
人力资源管理师8重保障一次拿证
2016社会工作者高清课件震撼上线
2016年职称英语高端押题班
轻松搞定英语四级考试 vip班全面升级
轻松搞定英语六级考试 放弃裸考
全面备战公共英语 名师带你高效通关
热门资料下载1/3
下载数:2137
下载数:1800
下载数:1712
下载数:779
成人高考专升本高起点全面招生
多种辅导体系 满足不同需求
233小学人生第一步开启学霸模式
无纸化课程 零基础一次通关
专家你倾力打造在线模考系统
名师坐镇 助你快速提分2015年暨南大学理工医药信息计算机类专场招聘会招聘会
2015年暨南大学理工医药信息计算机类专场招聘会
举办日期:
具体时间:
9:00-15:00
地区城市:
举办场馆:
暨南大学金陵文化广场
举办地点:
金陵文化广场
举办方会临时改变时间、地点、甚至取消,【应届毕业生网】提醒大家,开始前,可与举办方联系确认。
招聘会详情
  日暨南大学理工医药信息计算机类专场供需见面会  邀请函  尊敬的招聘单位 :  为促进高校毕业生就业,切实做好高校毕业生就业接收工作,有效解决就业问题,诚邀您参加日暨南大学理工医药信息计算机类专场校园招聘会  ,愿2016届毕业生能为贵单位的腾飞做出贡献。敬请贵单位莅临现场招聘。需招聘本科或以上学历。参会有关事项通知下:  联系人:熊老师  Q Q: 手 机:  邮 箱:  如有需要,请来电索取参会回执。  一、举办时间、地点  当天招聘会时间:上午 9:00―下午15:00,中午不休息;  地点:暨南大学金陵文化广场和旭日运动场。  地址:广州市黄埔大道西601号,  标准摊位,参会人员限定2人。  VIP摊位,参会人员限定4人。  2、配套服务:  A、提供一桌四椅,VIP摊位提供两桌八椅;  B、根据企业报名成功的先后顺序安排展位及海报制作(规格1.0m高x1.2m宽, VIP摊位海报规格1.2x2.4 ),请企业在提交报名材料的同时将制作海报资料发至邮箱,海报资料基本包括以下内容:单位简介(不超过500字)+岗位说明(岗位、人数、专业及相关要求等);  C、提供2位(标准展位)或4位(形象展位)工作人员的工作午餐及饮用水;  二、参会专业:  国际经济与贸易、会计学、计算机科学与技术、金融学、临床医学、食品质量与安全、药学、汉语言文学、历史学、戏剧影视文学、日语、英语、播音与主持艺术、广播电视新闻学、广告学、新闻学、导演、动画、美术学、音乐学、财政学、国际经济与贸易、金融学、经济学、统计学、财务管理、电子商务、工商管理、行政管理、会计学、旅游管理、人力资源管理、市场营销、物流管理、应急管理、法学、知识产权、国际政治、材料科学与工程、高分子材料与工程、工程力学、光电信息工程、环境工程、环境科学、建筑学、食品科学与工程、食品质量与安全、土木工程、信息工程、应用物理学、电子科学与技术、电子信息工程、计算机科学与技术、软件工程、机电数学与应用数学、通信工程、网络工程、信息管理与信息系统、信息与计算科学、化学工程与工艺、生态学、生物技术、生物科学、生物医学工程、应用化学、护理学、口腔医学、临床医学、针灸推拿学、中医学、药学、中药学、对外汉语、汉语言、华文教育、法学、广告学、汉语言文学、翻译、财务管理、工商管理、国际经济与贸易、金融学、市场营销、包装工程、电气工程及其自动化、电子信息科学与技术、软件工程、信息安全、自动化、电子商务、旅游管理、英语、体育教育等相关专业。   联系人:熊老师  Q Q: 手 机:  邮 箱:  如有需要,请来电索取参会回执。
联 系 人:熊小姐 联系电话:020-5
电子邮箱: 联系QQ:
显示检索结果面板&
此处用于展示结果面板
右侧结果面板
暨南大学金陵文化广场相关招聘会信息
相关招聘会信息
广州招聘会场馆推荐:
热门城市招聘会:对于卡内基梅隆大学计算机系删除基础课程中的面向对象编程课程,如何理解他们提到的「面向对象编程既是反模块化的又是反并行的」?
对于该问题,Quora上已经有人询问,但是总是觉得未能真正理解这句话。 附:
按投票排序
这个问题的根本在于 OOP 是基于状态的。每个对象都维护着自己的状态,暴露给外界的是一些可以改变对象状态的方法。一个对象的状态里可以有对其他对象的引用,一个对象的方法也可以调用其他对象的方法来改变其他对象的状态,所以这些状态还是关联的。很多人提到的线程安全与效率的取舍之类其实都是细枝末节,即使是有办法把所有方法都能高效地实现并且全都是线程安全的,只要状态存在,状态带来的问题就存在。在一个复杂的并发系统中,你调用 foo.bar(42),几个指令之后再调用 foo.bar(42),两次调用的结果很可能是不一样的,因为在这中间 foo 的状态可能已经改变了,或者 foo 引用的某个对象的状态可能改变了,不去看 bar() 的实现根本不知道结果依赖于什么。同样一段程序多次运行因为时序的不确定性可能结果也不一样。不管 OOP 也好,过去说的过程式编程也好,理论基础都是图灵机模型,而图灵机就是依靠对状态的记录和改变来进行运算的。图灵机里的纸带和状态寄存器用来记录状态,而读写头用来访问和改变状态。想象一下一个并行的图灵机(多个有独立状态寄存器和不同速度的读写头加上一条共享的纸带)就不难理解在这个模型下并发带来的复杂度。而目前很多人因为并发的需求所崇尚的函数式编程是基于 Lambda Calculus 的计算模型。计算由层层嵌套的函数调用完成;每个函数调用的结果只依赖于函数和它的参数。如果 f(4, 5) = 10,那么无论你在什么时候调用 f(4, 5),它的结果都是 10。相对而言,这是一个比较干净,比较容易推理和确保正确性的模型。OOP 的程序通常有很多隐藏的数据依赖,函数式编程把这些数据依赖都明确化了。但函数式编程最大的一个问题是,函数是一个数学抽象,在现实世界中不存在,它必须被模拟出来。目前为止被广泛使用的计算机还是基于图灵机模型,计算机的寄存器、缓存、内存就是用来记录状态的。要真正懂得程序设计,必须知道没有状态的函数是如何在充满状态的计算机上实现的,所以还是绕不开非函数式的编程。另外绝大部分的函数式程序设计语言都不是纯函数式的,出于实用性考虑都夹杂着其他语言的一些特点,并没有完全排斥状态。Haskell 号称纯函数式语言,用 Monad 来抽象状态,理论上可以自圆其说,但在实际使用中其实还是带来了很多不便(于是又发明了 Monad Transformer...)。从某种程度上说,状态是绕不过去的,毕竟人感知到的宏观世界就是由各种各样有各自状态的对象构成。函数式编程可以帮我们避免很多用其他方式容易犯的错误,在很多情况下写出更高质量的程序,但并发带来的复杂度并不会从根本上消失。各种编程风格一定是互相影响推动程序设计语言的进化,没有绝对的好坏,从 C++ 和 Java 最新标准里引入的函数式方面的功能就很容易看出这一点。比较有意思的是,OOP 最早是在 LISP 里实现的,而 LISP 也被很多人看做函数式编程的起始。同样,好的程序员也会根据具体情况使用合适的编程风格。OOP 不失为一种比较容易理解的在计算机程序里对现实世界的抽象,在很多场合的应用是非常成功的,至少我没发现以图形用户界面为中心的程序里有比 OOP 更行之有效的抽象方式。把 OOP 从程序员的教育中去掉过于片面和激进了。如果是从基础课程调整为选修课程则是可以理解的,我上本科时记得也是那样设置的。
这里的反应该理解为,面向对象编程不适合模块化、并行化。或者说OOP必然在模块化和并行化方面遇到一些障碍。但我觉得这并不是说OOP有什么不好,因为任何一种编程范式都有自己的局限。这事儿不能去较真成OOP不能模块化和并行化。就像你不能去较真C语言没办法OOP一样,你愿意的话可以自己搞出很多特性比如说私有(静态局部变量)、多态(函数指针)之类。这里的反的意思就是不适合,不好用的意思。说起来,现在的编程语言都是多范式的,OOP不适用于这,不适用于那其实也没啥问题。适合的场景使用适合的范式。OOP作为一门编程的基础课程被删除我还是比较赞成的,OO的优势桌面应用主要在于GUI,企业开发主要在于领域建模。而这些都与编程的基础课程没有什么太多的关系,换言之OOD是OO的骨,先学会设计和建模再运用OOP来实现这些理念才是最好的,而设计建模显然又不是基础课程的领域。所以不如在基础课程中废除OOP。照猫画虎不如先练好本领去画真老虎,否则只能反类犬。有些人用物理定律来打比方,是不合适的。OO是为了解决特定问题而被发明的范式,所以不去了解那些特定的问题,把OOP当作基础教学,是有问题的。就像绕开光速不变去谈狭义相对论一样,只能听个云山雾绕。事实上OO这个范式是非常年轻的,与大家所了解的不同的是,目前看起来是突然兴起的函数式啥的才是真正的元老和基础中的基础。其实我倒是觉得及早的让学生接触多范式语言,认识到编程不是一招鲜吃遍天的,会比较好,就这一点上,我觉得C#比C更适合用来教学。从这个反字里面我倒是嗅到了万能范式的味道,好像存在一种万能的编程方式,学会了就能快速NX的开发各种程序,这样说来的话,也许不是个好事。顺便说一下OOP怎么去做高并发。事实上OOP做高并发是很正常而且一点儿也不恐怖的事情,虽然说函数式在多线程的情况下会有先天的优势,但是上面一群人把OOP的多线程未免也抹的太黑了。首先抛弃对象的状态是扯淡的,这就不是OOP了。对象因有状态而成为对象,否则就是个函数集(Function Set),写出来的代码不叫做OOP,而是FP。并不是说,用OO的语言写出来的代码就都是OOP的。其次,由于状态的存在,所以所有的实例方法都应当假定是线程不安全的。说白了不必看源代码,如果一个方法不依赖于对象的状态,直接静态好了(否则就是糟糕的设计)。仅为了重写而专门写成实例方法的不依赖于对象状态的做法也是dirty的。所以,OOP的所有方法都是基于状态的,这个问题似乎无解了?怎么可能!那互联网还开发个球啊。所以OOP中多线程的方案就是不要跨线程共享非只读对象,就这么简单,是不怎么优美,但还能用。把状态局限在一个线程内,就啥事儿也没有了。什么?这样你就只能开一个线程了,那你干吗非要OOP来的。
基于状态做多线程一点问题都没有。现在的 OOP 的问题在于,这些语言都尝试把对象之间的消息传递重新嫁接在过程调用上,这是一切的原罪。正如 FP 如果直接用 C 的 calling convension 和 stack 的话一样会死,必须发明另外的组织方法一样。解法很简单:Actor。一个完美的体现 OO 精髓、完美表现对象之间“消息通信”,完美解决竞争状态和死锁可能,同时比函数式编程直观。Actor 的模型更从设计行提供了更多优化和扩展的可能性:,如 M:N 线程调度("~2.5 million actors per GB of heap." with Java / Scala [3]),以及分布式调度 [3]。所有真正的高并发库都是基于 Actor 模型的,从古老的 Erlang 到 Ada 和 Go(mk chan),以及 Scala 和某个 Clojure 1.5 新加的 Actor 库(找到了 [1]),以及 JVM 平台的 Kilim [2] ……真的不需要多说什么了。如果略微没有概念,推荐每个人去看 [4]:Rob Pike 介绍自己在 Plan 9 发明的 Newsqueak 语言的演讲。我自己看过之后对很多之前看 Golang 中云里雾里的疑惑都得到了清晰的来龙去脉的解答。[1] [2] [3] [4]
这个问题我在stackexchange上问过,有很多很好的回答,可供参考。
说实话,用面向对象的手法来写并发程序真的是难爆了。我最近在里面添加一个“从EBNF自动生成智能提示”的算法(写得差不多了,代码一直在 上更新),就遇到了这个问题。我们都知道,唯一可以给UI建模建的好用起来又爽的也就只有面向对象了,但是写智能提示又怎能不并发呢,于是我只好把OO和Actor这两种风格在C++里面混合了起来。幸好OO是鼓吹封装的,于是我把那些不需要给别人操作的Actor们也装在了另一个大类里面,用户只需要单线程的操作这个类就可以了。多线程的部分就在这个类的内部。于是当你操作不当的时候,不可避免的会遇到racing condition。什么是racing condition呢?就是多个函数同时运行之后的结果,跟他们挨个运行之后的结果不一样。你可以想象一下我同时对一个变量+1两次,如果你加的方法不对,有时候就会发生racing condition——结果只加了1,不是2。于是你就会慢慢明白OO跟并发到底抵触在哪了。防止racing condition,写出一个正确的并发程序,是需要你小心翼翼(对大部分流行语言都有是,除了Haskell)的处理一些状态变量,而OO却是希望你通过释放接口来阻止你对状态变量的认识(嗯, 说得对,面向对象他妈就是个祸害。而且祸害就算了,面向对象本来应该用interface oriented programming(认真学习COM就会得到这一点,但是这里的interface并不一定需要是语法上的interface。所以说很多不学无术的人除了喷COM难用以外根本没办法从她身上学到任何东西,这些程序员都是a piece of shit)来做,结果那帮人竟然鼓吹什么is-a啊,has-a这些伤天害理的知识,绝对是计算机科学教育的第一大祸害)。于是你现在开始写代码的时候就会遇到这个问题了:这个类的这个方法到底能不能并发呢? 呵呵,如果没有文档,也没有源代码,你永远也回答不出这个问题。这是不是意味着我们必须把每一个method都做成线程安全的呢?这当然不是,线程安全是会损耗性能的,而且不能忽视。那是不是为了性能就全部都做成线程不安全的呢?当然也不是,正确性永远都是第一位的。那到底要怎么做呢?当你用OO和并发一起做的时候,你除了付出痛苦来单独思考每一个method是不是需要做成线程安全以外,没有任何指导方法或者科学依据来减轻你的负担。当然对于工程师来讲,只要公司多给点钱,那我们自然可以把程序写得更好,于是这点小问题还是无所谓的。但是对于那帮做学术的人来讲,那就不一样了。他们眼中只有行跟不行,于是自然就说出这句话了。不过我认为这句话说的也是有道理的,我并不是在说他们说的不对,我是在同意他们。OO和并行你想做的好,除了看Jeffrey Richter的书以外,没有任何办法。但是我们知道,很多懒惰的人根本连教程都不愿意仔细看,怎么会学到正确的并发程序的设计方法呢?
流行的面向对象编程其实是对这一概念的误解,更像是市场推广。我觉得首先要正确理解这一概念才能谈是否是反模块化和反并行的。面向对象编程这一概念是由Smalltalk的发明人Alan Kay(不了解的人请Google)首先提出的。按Alan Kay的看法,面向对象最重要的一点是消息传递OOP to me means only messaging, local retention and protection and hiding of state-process, and extreme late-binding of all things. It can be done in Smalltalk and in LISP. There are possibly other systems in which this is possible, but I'm not aware of them.见面向对象就是为了解决大规模编程的复杂性问题提出的,用消息传递的方式降低模块之间的耦合。目前最流行的并发编程语言就数Erlang和Go了。根据Erlang之父Joe Armstrong,Erlang其实也是面向对象编程语言,在小的方面来讲又是函数式编程语言,所以面向对象和函数编程并不矛盾。(见)Erlang建立在Actor Model之上,而Go建立在Communicating Sequential Process之上,这两个计算模型都跟Alan Kay的消息传递模型有相通之处。所以说,消息传递模型也能很好地解决并发编程的问题。虽说纯粹的函数式编程语言没有状态,也就不存在竞争问题,适合并发,可那只是美好的愿望罢了,更像是书呆子的意淫,在现实世界中怎么可能完全消除状态,就连Haskell也要发明复杂的Monad来解决状态问题,所以说函数编程并不是解决并发问题的灵丹妙药。编程语言的发展过程可以看作不断远离图灵机模型而接近人脑思维模型的一个过程,最开始是汇编语言,直接操作图灵机的状态;然后是过程化编程范式,用各种更有局限的控制语句替代过于灵活的go to,现在则是面向对象和函数式编程语言的天下。简单地讲,就是要解决如何摆脱赋值语句的问题。面向过程和面向对象都没完全摆脱赋值语句,但是施加了更多的限制,防止赋值语句滥用。函数式编程企图使用数学意义上的函数概念完全消除赋值语句,但是没有成功,只得用更隐晦的方式加以保留。PS. 另外吐槽一下,在知乎上编辑文字真麻烦,排版又难看,既然要抄袭stackoverflow,为啥不全抄过来!
人家只不过是把OO的东西放到二年级去选修了。作为大一新生,先掌握基本编程技术进而学习数据结构和算法才是重要的,所以人家开了两门基础编程课程,一个函数式编程,一个指令式编程。没仔细看是不是这两门选一个修,还是都要修。我上大学的时候有一些兄弟是学scheme作为入门编程的,多数人都是java,到了下学期数据结构也是用java讲的,scheme的兄弟们就比较痛苦。。。课程设置不合理害死人啊
各位不要把因为自己没有找到好的方法,就埋怨语言的支持不好,语言层面的支持如果做到完美,那还要这么多高级的软件工程师干嘛,OOP是一种思想而已,就看你怎么用,面向事件驱动的设计模型当然可以很好的做到一个线程内支持大量并发的问题,关键就是看你如何去设计你的程序,如何去封装和定义你的事件,没有人让你再设计程序的时候一个劲的什么地方都使用OOP思想,才是遵循了OOP,一个复杂的软件里面,会同时存在这多种思想,只是在不同的角度和层次上看看,不同的思想会有一个主流的概念,比如在系统底层的通信机制和并发领域,可以使用基于事件驱动的设计,此处不是OOP的,但是对于系统服务层面的支撑模块,完全可以使用OOP的思想,毕竟OOP带给了软件行业非常大的发展,是有他的很大价值的。王根这哥们说的太偏激了,软件编程不光是给高级工程师的,那些大量存在的中间或者底层的开发人员需要面向对象的思维方式来工作,高级工程师的需要做的就是把难题隐藏起来,对于底层难题,没有人告诉你一定要用什么思想去实现,没有人要求你的代码在这个层面也需要拥有非常好的可读性,如果你非要跟OOP去较真儿,说他的什么什么方面做的不够好,那谁也没有办法。
开发有三种类型,或者程序员有三种类别。写框架的,写库的,和写功能的。面向对象之所以被很多人诟病的原因之一,是在框架和库的层次(如果这两个一起开发的话),他会形成巨型的继承树,一旦这颗树的设计出现问题,做细节的微调还可以,比如功能函数的上推下拉,局部重构等等,但是如果做大的调整很容易造成重大兼容性问题。面向对象之所以被很多人诟病的原因之二,是在写功能的层次,很多程序员都试图做出更大更深层次的抽象,不停的做抽象类和接口,在代码中生成大量的粘合层,而这些内容应该放到框架和库的层次去做,而不是在做功能开发时为了未来可能有的功能埋下大量的代码接口而忽略了开发功能的本质工作。面向对象之所以被很多人喜欢的原因之一,是适合描述世界。在进行编码的时候,需要做问题空间到解空间的映射,这个时候面向对象方式最接近人类的思维方式,这就是面向对象的东西总是相对的容易理解和使用。在过程式编程的时代,人们认为程序=数据结构+算法。而在面向对象时代则认为,对象=数据结构+算法,程序=对象+对象+...+对象。多了一层“封装"之后,对接口的理解更容易了,但是也付出了性能,维护,设计等等问题上的代价。并且对很多底层知识的理解,其实是不利的。我也曾经认为面向对象可以解决一切问题,设计模式可以解决一切问题,但事实证明如果一个东西被认为是万能神药,基本上就是骗人的。当我在编码中越来越痴迷于如何抽象和形成扩展可维护性,而耽误了正常功能进度时,我总是怀疑是否自己面向对象的功力还不够……现在我认为,面向对象也只是编程范式的一种,也只是一种解决问题的工具。适当的运用,还是很有必要的。对面向对象缺乏信心的人,可以看Qt的接口。Qt证明了面向对象也能做的非常出色,即使是在C++这种复杂的语言怪物上。不客气的讲,中国程序员偏重归纳总结和细节上的奇技淫巧,不擅长抽象和设计,而这些恰恰是面向对象系统最需要的素质。国内项目的话,如果做设计,常见的情况是,把其他人验证过的抽象,重做一次,这样最保险,但如果需要自己做抽象和设计的时候,往往会卡壳。面向对象系统的设计,如果没有大把的时间金钱和精力,不要做过渡尝试,因为只有不停的重构提炼,抽象才能越来越精确。对于中小公司的中小型项目,如果非要自己做框架和库的话,继承层次不要超过三到五层为好。也可以玩一玩组件式,那东西扩展性不错。
我们知道,命令式编程相当于在管理状态机。而其中的面向对象编程则相当于同时管理多个状态机,还要让它们之间交互,显然很难啊,也体现不出良好的划分啊。这就可以解释面向对象编程为什么是反模块化和反并行的。但是经过长期的发展,在各种设计思想和模式的帮助下,我们通过在一些经过充分研究的场景采用特定的编程模式,能相当程度地hold住多个状态机,从而在开发效率、运行效率、正确性、可靠性等方面取得一个较好的折中。我对函数式编程了解不深,但是对Closure, CPS, Functional Data Structure这些东西看着挺喜欢的。如果函数式编程的生态环境能发展到接近面向对象编程的程度,那也挺好啊。话说回来,我最喜欢的是类型系统,至于我擅长的OOP,还是我不擅长的FP,都不重要了。它们的大部分东西在我眼中没有区别。
模块化和面向对面其实毛关系都没有。说他是反模块化也一点都不过分。
反模块,在我看来OOP的核心设计目的之一就是更好的模块化,良好封装的对象本身就是模块,在Quora的答案中解释说反模块是因为对象被调用导致对象状态变化,是为缺点。这难道不是对象本身固有的属性吗?(举个荔枝,一个你喜欢的女孩子对你说了一句话(对象调用),然后你脸红了(状态变化))。反并行,目前的各种OOP编程语言对并行化支持都不太好,但是这个不太好跟GPU编程或者集群运行关系不大,这些问题完全可以通过运行框架解决。OOP反并行最主要的问题是对象调用是同步的(再举个荔枝,在OOP的世界里,你(对象)和一个女孩子(对象)说话(消息调用),你说完以后,必须要等她的反应(消息返回)才能继续下一步动作。而现实世界中,你说完话以后可以立即上知乎发个帖,跟大家讨教下主意)。题外话我支持CMU从大一新生课程中取消OOP课程的决定,我觉得学习编程语言应该从汇编开始,经历面向过程语言,然后学OOA,OOD,最后学OOP。编程其实是一门哲学,必须了解历史。
我觉得这个决定有点幼稚。就好像对物理系的学生说,因为物理学更先进的思想是量子力学和相对论,所以我们不要去学牛顿力学了
个人认为面向对象与模块化和并行并不矛盾。何止面向对象看问题更方便,还有更上层的面向包,面向服务呢。有本事你这辈子都别用C++、C#、java、python、perl,这辈子别学设计模式,别用类,别用stl,boost,mfc,.net 等等库,别用树啊表啊图啊数据结构,因为他们都是类。你就全部模块化的开发吧,当然也有好处,你可以根据你的需要把效率优化到极致,但是如果你写到一半忘了前面的某个细节或者出了bug你就慢慢调吧,绝对比你写代码的时间要长。面向对象在我看来,就是把有关系的数据和代码整理到一起。举个例子,有时候你可能会迷糊某个数据到底是放在这个类还是那个类,这就靠功能数据的组织能力了,架构要解决的也是这个,不过架构会从类的更高层来看,除非跟底层技术关系很大。而面向对象时基于状态这种说法我觉得刚开始学你可以这样认为,在设计模式中有一个状态模式,那才是把状态的变化表达的很出色的例子。
在手机上犹豫纠结半天,好想回答这个问题,但是不是很确定是否有能力答好。。先挖个坑,慢慢填,希望能填好。请多指正。面向对象分为两个层次的理解,首先最重要的是作为一种思考方式的存在,这种思考方式的核心是三个字:不确定。当我们可以把一个逻辑或者流程或者关系描述得很精确的时侯,我们并不需要面向对象的方法。我相信所有人都会承认我们所处的这个世界处于连续的动态变化和一种"测不准"的状态。所以随着我们需要用计算机描述、表达、解决更复杂的问题的时侯,我们并不能强制将所有的问题处理为独立静态的状况。很多程序员难以理解,这也许和许多人学习编程的顺序有关,为了能够解释各种语法关系,我们必须使用各种静态和固定的情景作为例子:例如赋值、运算、类型等。作为组成指令而存在,它们是必须并且是我们保持一致性的前提。但是,当我们看到的世界不是如此的时侯,我们需要改变我们的编写方法来符合我们看到的事实,因此有了对事物更抽象的理解,我们更追求在一种动态的平衡中描述它们。当我们去除那些静态的要素并赋予它不确定的状态的时侯,就是面向对象的思考的本质。从这个角度而言,面向对象是编程思维的深入。用通俗的语言讲,面向对象的策略和方法是不明确事物的状态或者关系,当能够明确某个部分的时侯我们就拿来使用,如果不明确就继续保持不明确。从这个角度回到问题,模块化将状态固定下来,并行强制将关系平行(一致化)这在面向对象的方法看来是不对的。今天先写到这里,手机上知乎不支持横屏,躺着打字手快拿不住手机了。
其实我一直都好奇为什么要面向对象。我觉得面向对象试图从语言的角度解决软件设计的问题,这个方向本来就是错误的,很蹩脚。
面向对象基本结构是继承,继承是一种强耦合,反模块化的做法。并行要求尽量 stateless,对象模型就意味着自己拥有状态。
对象中的变量算是一种范围内的全局变量,也会碰到一些全局变量会碰到的问题。将对象中的函数局限于访问内部对象,只能通过继承才能比方便的重用代码,对代码重用也是一种局限(通过组合的方式重用总会比较麻烦,比如对重用代码要做一些额外的工作)。特别是java,c++这种静态强类型系统,如果编码使用自顶向下的继承,代码的灵活性非常差,毕竟很难一开始就做好规划,所谓的is-a,has-a,在现实世界里碰到特例会死的很惨。
并行编程, 只要注意好防止函数的副作用就可以了. 即: 确保函数与外界的所有交互永远只通过其参数和返回值.
具体的做法就是: 确保类的成员里只有函数和不变量. 对于C#来说, 还应该避免使用ref参数这种做法保留了OO语言的优点: 适合领域建模, 可以通过继承来复用,
可以面向接口.同时由于成员"变量"是不可变的 , 也就意味着对象的"状态"是不可变的, 并发起来就没那么多顾虑了.当然在这种编程模式下, 以往那种"改变某个对象的状态"的操作是不可能的了,
而是代之以"创建一个拥有新状态的对象" 的做法.例如, 这样一段老式代码(C#): class Foo{
public int B }var obj=new Foo{
Bar=1 }; obj.Bar += 2; //改变了obj对象的状态, 副作用按新的原则是这样的:class Foo{
public readonly int B
public Foo(int bar){
}}var obj=new Foo(1); obj=new Foo( obj.Bar+2 ) ; //obj指向了一个新对象. 没有任何对象的状态被改变.
面向对象在做UI客户端界面方面还是很有用的,苹果的很多东西就是用objective-c写的,c++最擅长的游戏开发领域也是如此。只是面向对象确实被过度使用和宣传了,这个java应该负有直接责任,哈哈。

我要回帖

更多关于 委曲求全有没有用 的文章

 

随机推荐