查看: 3284|回复: 29
|
有谁能解释什么是OOP吗?
[复制链接]
|
|
如题~~~上网找了很多关于OOP的资料~~却一头雾水~~有哪位大大能详细和具体的解释给小弟什么是OOP呢?又用在什么地方?有什么功用?感激不尽^^ |
|
|
|
|
|
|
|
发表于 6-11-2011 08:25 PM
|
显示全部楼层
OOP=Object Oriented Programming (C++) vs Procedural Programming (Pascal) |
|
|
|
|
|
|
|
发表于 8-11-2011 02:04 PM
|
显示全部楼层
物件导向编程..
物件 - 一个单位/东西, 有分动态/静态..
(如人, 有身高/重量等数据, 这就是静态资料.. 动作则是动态..)
总的来说是一种以物件概念来编写的程序.. 就是OOP..
就这么简单.. |
|
|
|
|
|
|
|
发表于 14-3-2012 07:44 PM
|
显示全部楼层
OOP 是指 object oriented programming,
指的是一種符合 Object Oriented 方法論的 programming 方法。
相關的詞還有 OOA (Object Oriented Analysis)和 OOD (Object Oriented Design)
不管是哪一種,Object Oriented 最終的目的在於降低修改 requirement 所影響的範圍。
一般而言, user requirement 在開發的過程中總是不停的在改變,
而 requirement 改變所帶來最直接的影響就是 code 的改變,
如果 code 沒有遵守 OO 的守則, 那麼被影響的範圍將會非常的大,甚至有可能讓程式
架構“腐爛”
當然,用了 OOP 不一定就能達到降低修改範圍這個目的。
因為 OOP 只是工具, 重點還是要知道如何設計才能適應改變,這個時候就要參考
大師們的傑作 Design Pattern 了,(不過 OO 沒有基礎是看不懂滴~)
總之呢,有些遠見的軟體公司都會要求 OO,(怕你把人家寫好的 code 搞爛),如果沒有要求 OO 的公司也不用去了,反正是去擦屁股的。
so, 對出來工作而言, OO 只是一個入門 |
|
|
|
|
|
|
|
发表于 15-3-2012 12:13 PM
|
显示全部楼层
举个例,当LZ去应征时填写个人资料文件交给HR,HR将会收集个人资料文件作出分析(OOdata analysis)而决定请哪一个人选。
个人资料文件 --> object oriented
个人资料文件设计格式 -> OO design pattern
HR 收集个人资料文件作出分析--> OO data analysis |
|
|
|
|
|
|
|
发表于 8-10-2012 09:46 PM
|
显示全部楼层
基本上OOP有4个principles :
Encapsulation
Abstraction
Inheritance
Polymorphism |
|
|
|
|
|
|
|
发表于 13-10-2012 08:51 PM
|
显示全部楼层
on9-shop 发表于 8-10-2012 09:46 PM 
基本上OOP有4个principles :
Encapsulation
Abstraction
Encapsulation
Abstraction
Inheritance
Polymorphism
请问,这四个到底怎么解释?
|
|
|
|
|
|
|
|
发表于 16-10-2012 10:49 PM
|
显示全部楼层
加峻 发表于 13-10-2012 08:51 PM 
Encapsulation
Abstraction
Inheritance
Encapsulation (封装)
每个物件(Object)的属性(Attributes)都应该被隐藏(Hidden)起来,只有通过固定函数(Method)才能读(Read)和写(Write);这样做的话可以很大程度上避免物件之间有太过密切的联系(Tight-Coupling/Dependency) : 如要在某物件上储放一个数值,内部如何储存,变量(variable)名称对我们来说都是不重要,只需知道需要调用哪个函数。
Abstraction (抽象)
当系统里有两个以上物件时,我们可以将他们相似的地方(可以是属性或函数接口)抽离出来,形成一个共同点(Base/Common)。这样做可以方便我们管理庞大的代码,而不需要将同一改动复制到各个物件上。
Inheritance(继承)
我们可以将一个物件A设定为另一个物件B的延续,这样的话A将拥有B的属性及函数。A也可以增加额外的属性或重新定义一些函数来体现自己与B的区别。
本帖最后由 yeenfei 于 16-10-2012 11:14 PM 编辑
|
评分
-
查看全部评分
|
|
|
|
|
|
|
发表于 18-10-2012 11:30 AM
|
显示全部楼层
主要就是把抽象的function堆成为一个比较具体化的物件(object)
编写方式就是写class,
因为分类, 所以中文都叫class =类
主要目的方便明白和管理。还有再循环运用。(re-use)
别不明白缘故,而死背名词,很伤脑的。 |
|
|
|
|
|
|
|
发表于 25-10-2012 01:53 PM
|
显示全部楼层
说的简单一点,传统programming是把所有的coding都放成一团,但是将来要fix bug或更改什么,很多时候就要在几万lines的coding里挣扎。
OO是把coding部门化(变成classes),并且列明外界如何能和这个class沟通,例如这个class的private variable/method 和 public variable/method 等等。当别的class或外界要用到这个class的时候,就不需要看或用到class的private variable/method,因为它们是for internal class usage的。长期来说,OO这样的规划会让system更容易管理和更改。
再更深入一点,就是再把OO变成3-tiers。也就是把系统分成Data Access Layer, Business Logic Layer, & User Interface Layer不同的classes。 |
|
|
|
|
|
|
|
发表于 30-10-2012 11:30 PM
|
显示全部楼层
用中文来解释 OO 其实还蛮方便的。例如:
基本物件 "chicken" 鸡
鸡的属性 properties (attributes) 有
leg = 2
wing = 2
gentle = M / F
age = number
而鸡的动作 action / events 有
1) lay_egg 生蛋,
假定条件是至少要 3 岁的母鸡。
condition : gentle = F, age >= 3
2) walk
3) sleep
基本上,每一只鸡都是从这个样板复制,或制造出来的,
而每一只鸡都拥有同样的属性,动作,但是有各自的不同点。
现在,用程式举例
object hen = new chicken();
hen.gentle = F;
hen.age = 3;
// leg 和 wing 的数字是默认 2 ,不更改
hen.sleep();
hen.walk();
hen.lay_egg();
// ======================
object cocks = new chicken();
cocks.gentle = M;
cocks.age = 3;
cocks.sleep();
cocks.walk();
cocks.lay_egg();
// 公鸡不会生蛋,所以这个动作是无效 null 或者显示 error
// ======================
object chick = new chicken();
chick.gentle = F;
chick.age = 0;
chick.sleep();
chick.walk();
chick.lay_egg();
// 就算是母的,小鸡也不会生蛋,所以这个动作是无效 null 或者显示 error
// ======================
// 杀掉可以有两种方法,dispose 或者把 variable 变空
hen.dispose();
cocks = null;
// 增加年龄
chick.age ++;
本帖最后由 flashang 于 30-10-2012 11:34 PM 编辑
|
|
|
|
|
|
|
|
发表于 1-11-2012 04:44 PM
|
显示全部楼层
OOP 可以让你的code 简洁有力,又有延申性。用得好可以让你的软件长命,反之也没什么,就是会被就你手的人诅咒吧...  |
|
|
|
|
|
|
|
发表于 1-11-2012 10:58 PM
|
显示全部楼层
kennynjc 发表于 1-11-2012 04:44 PM 
OOP 可以让你的code 简洁有力,又有延申性。用得好可以让你的软件长命,反之也没什么,就是会被就你手的人诅 ...
不完全是这样。
如果有良好结构和说明 documentation 接手的人可以少做很多。
|
|
|
|
|
|
|
|
发表于 2-11-2012 09:24 AM
|
显示全部楼层
flashang 发表于 1-11-2012 10:58 PM 
不完全是这样。
如果有良好结构和说明 documentation 接手的人可以少做很多。
同意。概念要自己领悟然后用在实践。通常少做很多的那part是可以让人进步最多的地方.. =)
|
|
|
|
|
|
|
|
发表于 5-11-2012 02:47 AM
|
显示全部楼层
个人觉得Encapsulation有点多余,
以及质疑它的实用性。
如果坚持要做Encapsulation的,
只会增加繁琐的工作量而已。
有没有看过要Encapsulate,
但是却把全部的member都Property出来的?
感觉多此一举。
不如干脆把它们全public出来就好。。。
另外,他们也喜欢把其实就是Global variable的变量,
一直的从这个Object, pass 进另一个object的。
为了能够一直pass来pass去,
结果需要define很多重复的method/constructor带进去,
以及要declare很多local variable来hold着它。。。
真是增加工作量又不reusable...
如果是我自己的做软件,
只会用Polymorphism与Inheritance而已。
Encapsulation只是选择性的使用。
Global的就直接用global好了。
要完全假Encapsulate的,
也只是为了饭碗,
做给只为了要开口闭口要符合OOP的公司而已。。。

本帖最后由 Sunyata 于 5-11-2012 02:48 AM 编辑
|
|
|
|
|
|
|
|
发表于 23-11-2012 12:28 AM
|
显示全部楼层
|
|
|
|
|
|
|
发表于 23-11-2012 01:03 AM
|
显示全部楼层
yeenfei 发表于 23-11-2012 12:28 AM 
encapsulation 如果用来隐藏内部collection很不错下,不用烦是不是Array, Vector, List, Map, etc[/backc ...
Encapsulate好有坏。
Encapsulate一些外人不需知道的东西固然是好。
不过却加重了编程的工作。
因为当简单的type也Encapsulate时,
而当你又要用到时,
你就知道有多tedious了。
就好比Color里所有颜色的定义。
就算是微软也无法避免使用global variables,
e.g.: Application.OpenForm[0]
就是个例子。
至于什么array, vector之类的,
根本不是问题。
因为以现在先进的IDE,
它的intellisense就足于告诉我们它是什么type了。
|
|
|
|
|
|
|
|
发表于 23-11-2012 11:24 AM
|
显示全部楼层
偶进来学习学习。 |
|
|
|
|
|
|
|
发表于 23-11-2012 11:45 PM
|
显示全部楼层
Sunyata 发表于 23-11-2012 01:03 AM 
Encapsulate好有坏。
Encapsulate一些外人不需知道的东西固然是好。
不过却加重了编程的工作。
一些像eclipse 的IDE把开发者弄得越来越懒了 会自动提醒该type目前的设计access不到,列出解决方案123,按个键就自动生成setter/getter, 或者promote visibility
|
|
|
|
|
|
|
|
发表于 23-11-2012 11:45 PM
|
显示全部楼层
hui_wooi 发表于 23-11-2012 11:24 AM 
偶进来学习学习。
他妈的个个大神都在这里潜水出现,想骗骗香火也不能
|
|
|
|
|
|
|
| |
本周最热论坛帖子
|