這可能不太適合Stackoverflow,但這是一個非常好的問題,應該加以解決。你偶然偶然發現了一個編程中的常見問題:大多數「OOP」程序實際上並不是面向對象的。
OOP的重點在於封裝複雜性。艾倫凱最初從生物細胞的角度來設想它,細胞的所有機器都與外部世界隔絕,而且你只能通過輸入和輸出的信息與細胞相互作用。因此,一個對象封裝了一個完整的系統,並且本身將由對象組成,並且可以與其他對象組合成更大的對象。而且一切都會與消息溝通,沒有人能夠窺視其他任何人。這就是面向對象編程的含義,大量的寫作仍然受到這個想法的影響。但大多數自稱爲OOP的東西並不這樣做(做的這樣的工作現在通常被稱爲「Actor模型」,它可以是一種非常有效和可靠的編程方式,用Erlang等語言加以說明)。
今天大多數OOP系統認爲一個對象是一個不太有趣的事情(至少在我看來):只是數據和方法的組合,可以作用於這些數據。行業內存在很大爭論,這是否是一個特別有用的構造(相對於從方法中分離數據的功能範式,或純粹集中於功能而非類的鴨子鍵入範例)。
但在實踐中,我會說在大多數情況下,我們創建對象有兩個原因:聚集數據並封裝責任。這些是非常不同的東西,但在許多流行的語言中,它們都被視爲「對象」。
在「叢塊數據」的情況下,當你有一個邏輯上應該合在一起的數據集合時創建一個新對象。例如,Point是兩個座標的集合,這是一個非常好的「數據對象」。
關於「封裝責任」,這指的是我們所說的「單一責任」原則。一個對象應該完全負責你可以命名的一個「事物」。例如,那個「東西」可能是「網絡連接」,或者可能是「畫這個窗口」。你有一個Connection類和一個Window類等等。真正的關鍵是命名。當你很容易命名它時,你知道你有一個好的課堂,並且它所做的一切似乎都是從你給它的名字開始的。當很難命名它時,你可能已經創建了錯誤的類。
類層次結構的關鍵教訓叫做替代原則(由Barbara Liskov形式化)。如果你打算創建一個子類,它必須能夠在任何地方使用它的超類可以被使用。所以Corgi IS-A狗,因爲狗可以做的一切,Corgi可以做。但是,令人驚訝的是,一個Square是而不是是一個Rectangle。矩形可以創建兩種長度。廣場不能。 Square-Rectangle問題可能是導致繼承錯誤的最常見原因。一個很好的教訓是遺傳是許多問題的錯誤工具。你應該喜歡結合多個對象而不是繼承。所以在創建新類時,淺層次往往是最好的。如你所發現的,你所看到的大部分叫做「OOP」的只是包含在對象中的程序性編程。這對新人來說非常混亂。我們這些幾十年來一直在做這件事的人很困惑。你只需要看看。
我通常遵循[單一責任原則](https://en.wikipedia.org/wiki/Single_responsibility_principle)如果課程開始有超過1個責任,我將其分成兩部分(也可能是其中一個課程代表到另一個)。 – Augusto
這個問題會更適合StackExchange上的其他站點嗎?我認爲可能有一些具體的例子說明了什麼是好的(實用的)面向對象,所以希望我們能避免看法。但它可能相當廣泛。 – armadadrive