對(duì)于寫(xiě)大規(guī)模的程序、用一些模塊,還有從底層了解一門(mén)程序設(shè)計(jì)語(yǔ)言了解OOP是不可避免的。
上面是從實(shí)際的需求中去理解為什么要使用OOP的,也就是使用了OOP的編程方式,確實(shí)使得一個(gè)項(xiàng)目的程序非常容易理解,同時(shí)維護(hù)也很方便。這是從一種實(shí)用的角度來(lái)理解其意義的。因?yàn)樗糜盟晕覀兙陀谩?/p>
但其實(shí)還有一層原因,我引用一段話來(lái)表述:
面向?qū)ο蠓椒ǖ某霭l(fā)點(diǎn)和基本原則是盡量模擬人類(lèi)習(xí)慣的思維方式,使開(kāi)發(fā)軟件的方法和過(guò)程盡可能接近人類(lèi)認(rèn)識(shí)問(wèn)題和解決問(wèn)題的方法與過(guò)程,從而使描述的問(wèn)題空間與其解決空間在結(jié)構(gòu)上盡可能一致。
Perl 中有兩種面向?qū)ο蟮慕M織方式:1. 默認(rèn)的(這里僅討論默認(rèn)的);2.Moose
R 中有兩種主要的面向?qū)ο蠼M織方式:1.S3 2.S4
一個(gè)重要的問(wèn)題:
類(lèi)(class),對(duì)象(object),實(shí)例(instance) 這三個(gè)概念一定要分清楚!
【本人Perl程序設(shè)計(jì)語(yǔ)言背景】對(duì)象是類(lèi)和實(shí)例的統(tǒng)稱(chēng),在我們實(shí)例化的過(guò)程中,有兩種實(shí)例化的方式:第一種是以類(lèi)為原型(prototype) 構(gòu)造一個(gè)對(duì)象,這樣構(gòu)造出來(lái)的對(duì)象是類(lèi)的一個(gè)模板,是沒(méi)有自己特有的屬性的。但是另一種方式實(shí)例化一個(gè)對(duì)象的時(shí)候,是有自己特有的屬性的。
#舉個(gè)例子:
my $horse = Horse -> new() #創(chuàng)建一個(gè)沒(méi)有私有屬性的對(duì)象!
# 或者不需要聲明
use Horse;
Horse-> speak() #直接調(diào)用原型的方法!
--------------------------------------------------------------------------------------
my $horse = Horse -> new("My horse") #有自己私有屬性Name 的對(duì)象!
實(shí)例化產(chǎn)生的對(duì)象的本質(zhì)
因?yàn)镺PP只是一種代碼組織方式!
組織方式 | 本質(zhì) |
---|---|
Perl默認(rèn)方式 | Perl 對(duì)象本質(zhì)上是一個(gè) 哈?;蛘邩?biāo)量的引用,數(shù)據(jù)與方法不分離 |
R S3 | 是一個(gè)list并有一個(gè)名為class的屬性,數(shù)據(jù)與方法分離 |
R S4 | 同java一樣是真正的面向?qū)ο螅紫榷xclass,然后new一下。但是還是數(shù)據(jù)與方法是分離的 |
方法調(diào)用方式
在Perl里面方法是需要直接寫(xiě)在Perl的里面的。
而在R里面,不論是S3還是S4對(duì)象系統(tǒng)。 是獨(dú)立地去寫(xiě)一個(gè)方法,這個(gè)方法會(huì)智能地根據(jù)傳入對(duì)象的類(lèi)來(lái)判斷用什么方法!
當(dāng)然上面的說(shuō)明并不是絕對(duì)的,你也可以在Perl里面獨(dú)立地寫(xiě)一個(gè)方法,而這個(gè)方法是和R一樣的。 同時(shí)你也可以把你需要的方法寫(xiě)到一個(gè)類(lèi)中。
為什么會(huì)產(chǎn)生這樣的原因?
因?yàn)镽和Perl 產(chǎn)生的原因不同: 看看R 的生成的背景就可以想到,在統(tǒng)計(jì)里面有很多公共的方法需要調(diào)用。比如mean,sd這一類(lèi)的函數(shù)。但是對(duì)于每一次這樣地調(diào)用這些函數(shù),你不可能每一個(gè)都讓統(tǒng)計(jì)學(xué)家去寫(xiě)一個(gè)循環(huán)。但是 問(wèn)題是對(duì)于mean,sd這一類(lèi)的函數(shù),它面對(duì)的傳入對(duì)象參數(shù)一般是很復(fù)雜的,尤其是經(jīng)過(guò)很多其他的包的計(jì)算就非常的復(fù)雜了。對(duì)于這些計(jì)算的結(jié)果,我們往往不知道你需要調(diào)用哪個(gè)方法。所以,還是把方法獨(dú)立出來(lái),讓這些方法“智能一些”,這些方法會(huì)根據(jù)自己的類(lèi)來(lái)產(chǎn)生所需要的結(jié)果。