台灣最大程式設計社群網站
線上人數
1562
 
會員總數:240909
討論主題:186668
歡迎您免費加入會員
討論區列表 >> VB.NET >> Class一定要是名詞嗎?
[ 變換順序 ]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
Class一定要是名詞嗎?
價值 : 50 QP  點閱數:247 回應數:14

樓主

city
初學者
10 20
400 90
發送站內信

請問各位前輩們:

有在網路上看過:Class最好是"名詞"

書上的範例大多也是:
Class交通工具
Class汽車
Class跑車
Class飛機
Class員工
Class經理
...
...

可是實際在寫程式時 很難想像出如何把程式碼取出"名詞"

只能想說要解決一個一個的問題
於是就用副程式或函式來解決問題
一個副程式(或函式)解決一個問題

後來想說用物件導向來寫

於是就變成了一個Class解決一個問題
比如說:
Class開啟網頁
Class平方公尺轉成坪數
Class新增資料夾
...
...

雖然是寫在Class 可是都是"動詞" 本質上跟副程式沒什麼兩樣

附上Class開啟網頁的程式碼:



以上的程式碼 符合了Class的封閉性(欄位無法被讀取 只留下公開的介面:屬性 New Sub)
獨立性(這是個可以獨自完成任務的Class)(不需要依賴其他的Class)

可是這個Class本質上是個動詞
也沒什麼被繼承的必要
也不太能夠被多型使用
就只是解決了一個問題:(依使用者給的網址 開啟這個網頁)

想請問各位大大們:

[問題一]
這個範例 算是物件導向嗎?

[問題二]
物件導向會寫到這麼"小"的Class嗎?
(會切割成那麼小的Class嗎?)
(感覺物件導向的Class都是"解決大的問題" 這麼小的東西 用副程式就可以解決了 有必要寫成Class嗎?)

[問題三]
大大們寫的Class都是名詞嗎?
大大們寫的物件導向裡 會包含這樣的Class嗎?

謝謝~~

搜尋相關Tags的文章: [ VB.NET ] , [ Class ] , [ 名詞 ] ,
本篇文章發表於2017-10-08 12:59
別忘捐VP感謝幫助你的人 新手會員瞧一瞧
1樓
不錯的參考

羅伯斯
檢舉此回應
Class一定要是名詞嗎? 這個應該沒有一個標準規範
Class的命名方式,如同一般的變數,只要符合該程式語言的命名規則,就沒啥問題

主要的考量是日後Code可維護性,命名時要考慮日後維護的易理解性
也就是當日後Code有維護需求時,不論是任何人(包含自己)
都可以很明白的從物件名稱,看出其主要用途為何

PS.
Code的日後維護,有其必要性,而維護的人,有可能是某甲、某乙、某丙......等
甚至於就是Code的原始開發者,所以若不能從物件的名稱中,獲得該物件的用途訊息
那對Code維護人來說,肯定是一場災難。

本篇文章回覆於2017-10-08 17:00
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
不錯的參考

Zeeman
檢舉此回應
所以說在寫這個Class要先分析一下
你的Web操作有沒有應用的某個設計模式之下
也就是你打算設計一個什麼樣的網頁操作給別人用

分析一個你這個例子

這個Class只有一個Method
有一個必要的w屬性
而這個2屬性跟你唯一個OpenWeb是綁在一起用的

你想想跟我下面說的這個,那個比較符合需求
一個靜態的Web工具類別,提供Web的開啟等作業

實作


如果有符合你的操作需求
那這樣的做法會好多了
而Class又回到了名詞

再者
你原本的作法不是不可以
但Class名稱跟設計上你的做法是要調整的
有沒有必要就是你在寫之前依照需求分析下的結果

你可以看一下代理模式,命另模式跟觀察者模式
用介面把行為規範好
模個高階的物件專門吃這些行為介面
也就是把行為委派給這個高階操作類別

這個我真的無法在這用文子慢慢把情境跟範例慢慢寫出來
這些真的要等你物件導向先熟一點
然後開始讀設計模式再來探討
本篇文章回覆於2017-10-08 17:37
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
最有價值解答

誰是誰
檢舉此回應
依照 C# 或 VB.NET 的慣例,型別名稱比較可能是名詞或形容詞,動詞的情形比較罕見。
以你的例子來講,我可能會命名為 WebOpener
講到設計
照你程式碼來看,這個類別的意圖只做一件事 -- 傳遞一個字串, 然後用 Process.Start 啟動某個和此字串有關聯的程序 (MSDN: 藉由指定文件或應用程式檔案的名稱啟動處理序資源,並將該資源與新的 Process 元件相關聯)

如果整個意圖真的只有這樣,以設計的觀點來看
(a) 要不就是個 static class (VB 的 Module) 。
(b) 要不就是把 OpenWeb 設計成 static method (VB 的 Shared)。

然後把那些甚麼屬性、建構式之類的全拿掉,那個字串從 OpenWeb Method 傳進來就行了。

物件導向是個靈活的學問,沒有 "一定怎麼寫才對",OOP 只有三個技巧 -- 繼承、封裝、多型,重點在你能夠用這三個技巧寫出漂亮的程式碼就需要非常多其他的知識了。
而程式設計真正的重點是 "在當下要表示的意圖與情境下,怎麼樣的程式碼才能符合需求" ,
這句符合需求,代表很廣大的意義,諸如最終的使用、程式碼的設計意圖、易讀性、易維護性與擴充性等等;
其中擴充性是一個比較特別需要視情境調整的特點,並不是甚麼時候都要把程式碼寫得可以無上綱的擴充。
事實上,只會對於目前能接收到的情境考量其擴充設計,如果很不幸地遇到剛開始設計時沒想到的擴充情境,遇到時重構程式碼即可。
有一句很有哲理的話:『只寫剛剛好的程式碼。』這句話很短,但能夠實踐的人並不多。

我們常說: 如果你的整個專案只有 300 行,那隨便你愛把 code 寫多髒都沒差;
但,如果專案需要 30000 行程式碼,那又是另外一回事了,當你在這種專案把 code 寫的很髒,而且日後很不幸地妳還要自己維護這個專案,那就是搬石頭砸自己的腳了。

本篇文章回覆於2017-10-08 17:45
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
作者回應

city
檢舉此回應
哈 前輩們果然眼力好

我寫的那個Class 事實上作用只有一行程式碼:
Process.Start()

為了防堵開啟網頁會出現錯誤 所以用Try包覆起來

因為程式裡面呼叫了好幾次的Process.Start()
所以我把它拉出來 變成一個副程式

一開始的確是放在模組裡面

後來想說用Class來寫
就丟進了ClassUtility裡面
(裡面一堆共用的Sub Function)


看了一下[Zeeman] [誰是誰]大大們提供的方法
再回頭檢視一下我原本的程式碼
感覺的確有些累綴 有些濫用程式碼
欄位 屬性 建構式的確可以拿掉
改成Sub裡面的參數

我想這應該就是[我是誰]大大所說的"把code寫髒"
程式碼的確是要寫到最精簡
本篇文章回覆於2017-10-09 11:17
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
不錯的參考

浩瀚星空
捐贈 VP 給 浩瀚星空 檢舉此回應
一般來說,class很少會用行為或是方法做為命名的。

因為一般來說,所謂的class就是代表一個零件。一個可以組合運用的東西。

雖然說命名的規則並不一定是強迫性的。

但大多數而言,因為會設計成class是一定代表一個元件。所以大多都是名詞居多。

就如資料庫來說會用db命名的意思一樣。

你不可能將 del 刪除做為一個class吧。

所以依照你的問題

[問題一]
這個範例 算是物件導向嗎?

真要認真說起來,我會將其視為不算物件導向。因為這看起來反而比較像是函數的做法。

[問題二]
物件導向會寫到這麼"小"的Class嗎?
(會切割成那麼小的Class嗎?)
(感覺物件導向的Class都是"解決大的問題" 這麼小的東西 用副程式就可以解決了 有必要寫成Class嗎?)

所以才會說,你完全搞錯了class的方向了。class只是一個零件,這個零件是會有多個方法才會將其做為class。
如果你只是將動作做為class。只是多餘的。
也就是說你完全不明白class的意義何在,才會有此一問


[問題三]
大大們寫的Class都是名詞嗎?
大大們寫的物件導向裡 會包含這樣的Class嗎?

我這堻ㄛO名詞。依我設計的購物商城來說。
我建立的class有 用戶、信箱、廠商、購物車......

會不會包含這樣的class。這是不可能的事,同第二點的說明。
本篇文章回覆於2017-10-09 11:21
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
6樓
作者回應

city
檢舉此回應
昨天晚上睡覺前看了一下[羅伯斯]大大所提供的四個網頁

其中第四個網頁 讓我感覺非常的驚訝 神奇
網址:
https://www.ptt.cc/bbs/SFFamily/M.1075180006.A.AE4.html

雖然覺得非常的神奇 但仍然說不出它神奇在哪

今天早上起床 又看了一次網頁
突然有個想法:
(以下是個人想法 若有錯誤請指正)

原來說不會物件導向 指的是不會"用" 而不是不會寫

就如同我最上面寫的那個ClassOpenWeb
其實它已經是一個類別了
(寫的好壞是另外一回事)

重點是:我不知道如何"利用這個Class來做事情"

就如同網頁的範例一樣
其實Class 3DPoint是非常的平淡無奇
只是兩個屬性+1個函式
可是神奇的是底下如何運用這個Class 3DPoint

我想物件導向神奇的地方應該是:
如何利用已經寫好的Class來做事情

回到了我的問題

我一開始寫的ClassOpenWeb
的確有些瑕疵
可以精簡到前輩們建議的程式碼

但ClassOpenWeb的確是個類別
沒有人可以說它是個錯誤的類別

甚至:
Public Sub Class Class空
'空的(沒有程式碼)
End Class

它也是一個類別
可以被:
Dim a As New Class空

而:
Public Sub Class Class我不知道要幹嘛
Public Property 只有我一個屬性我不知道我可以拿來幹嘛 As String
End Sub

這個Class只有一個屬性
但是它仍然是個類別
別人可以拿它來做一些事情

回到ClassOpenWeb
儘管它的功能只有開啟網頁
就如同一個副程式一樣

Class跟副程式的相異是:
Class可以"被利用"

而這個ClassOpenWeb的的確確是個類別
而且是正確無誤的
(正確指的是ClassOpenWeb是個類別這件事 而不是ClassOpenWeb裡面的程式碼)
(就算是Class空 也是個正確的類別)
(只是使用它無法做什麼事)

回到Class的名稱

其實它是名詞或動詞已經不重要了
它只是個代號而已
會說Class名稱是名詞 應該是個建議值 或是理論上來說 或是通識

比較重要的是Class的名稱應該要讓人看得懂是什麼東西
(欄位 屬性 方法 變數名稱 ... 也是一樣)

想一想如果當初微軟設定Button這個類別叫做BT
(應該會很多人不懂BT是什麼東西 是But嗎? 還是鼻涕? 還是???)
BT類別裡的屬性是a b c ...
BT類別裡的方法是AA BB CC ...

這樣應該會天下大亂吧
BT.a=120(按鈕寬度=120)
BT.b=30(按鈕寬度=30)
BT.c=10(按鈕的Top=10)
BT.s="按鈕1"(按鈕的名稱叫按鈕1)
...
...

以這樣來說
沒有人可以說ClassOpenWeb是個錯誤的類別名稱
也不可以說類別名稱是動詞是錯誤的

只有建議應該取怎樣的類別名稱會比較好

比如說:
OpenWeb 改成網頁開啟器
CreatDirectory 改成資料夾新增器
FormTop 改成Form最上層控制器
...
...
(以上是如果硬要改成名詞的話 隨便舉例的)

哈哈 好像越寫越亂了
就先打住了
以上是目前的個人想法
如果前輩們覺得哪裡有錯誤 或是看不下去的 歡迎指正喔~~ ^^
本篇文章回覆於2017-10-09 12:21
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
7樓
作者回應

city
檢舉此回應
To:浩瀚星空

剛剛在寫#6樓內容的時候 原來大大有回了一篇文
我6樓打完才看到大大的發文 現在回一下大大#5樓的發文

一開始大大說Class名稱最好用名詞
OK 這點我同意 以後會思考Class該用什麼名稱
(如果是副程式改成的Class 我就把動詞坳成個名詞)
(哈哈 大大看到這個應該很無言)
(我知道比較正確的Class應該是從程式或者需求裡萃取出來的 應該本來就是個名詞的 但是我現在的功力還做不到這樣 所以只好先拿副程式來改(或說拿來練習))

問題二跟問題三 我同意大大的說法

問題一我有個疑問 不知道大大的看法是如何?

(以下是個人想法 大大如果覺得有誤可以指正)

我覺得Class跟副程式其實沒什麼差別
把副程式寫成Class也是可以的

Class跟副程式的相異是:
Class可以"被利用"

(實務上來說就是Class可以被當成 欄位 屬性 方法裡的Byval傳遞 陣列 ... 等等)
Dim a As Class1
Public Property a As Class1
Public Sub A(Byval x As Class1)
dim a(2) As Class1

也就是說重點其實是如何利用已經寫好的Class

如果把副程式改成Class
如果能夠利用這個Class的話 它就符合物件導向的精神

物件導向的精神應該是如何利用Class
只要能夠好好的利用Class 它就是物件導向

以上純粹是目前個人的想法
(想法可能隨時會改變 所以說是目前)
大大如果覺得有誤 歡迎指正 ~~ ^^
本篇文章回覆於2017-10-09 12:48
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
8樓
作者回應

city
檢舉此回應
對於物件導向還不是很明瞭

附上兩個範例 請前輩們指正

第一個範例會在D槽新增3個資料夾
第二個範例會開啟一個資料夾

(以下範例故意不使用Shared)






由於目前還不太會物件導向
因此先把副程式改成Class來嘗試

第一個範例是把陣列的資料型態設定成自訂類別
第二個範例是把自訂類別當成了:方法Byval的參數

以上兩個範例
前輩們認為這樣算是物件導向嗎?

謝謝~~
本篇文章回覆於2017-10-09 13:34
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
9樓
作者回應

city
檢舉此回應
回應一下#6樓

6樓的內容說的有點偏激
主要想表達的是:

一開始接觸物件導向的時候會卡住
原因是不知道怎麼使用已經寫好的類別

因此才會說不是不會寫 是不會用

而第二階段是
假設已經懂得利用已經寫好的類別
這時候又要回到了:如何寫

這應該是物件導向所說的抽象(萃取)

個人目前應該還在第一階段 嘗試如何使用已經寫好的類別
(所以才會拿副程式來練習)

第二階段對我來說 是以後的事情了
(現在的等級還無法做到從程式中萃取出類別)

(以上是個人想法 若有誤 前輩們可指正 謝謝 ^^)
本篇文章回覆於2017-10-09 13:44
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
10樓
作者回應

city
檢舉此回應
補充一下#8樓

兩個範例特意不寫上Shared的原因是要讓類別傳遞的更明顯:
ar(i) = New ClassCreatDirectory

如果加上了Shared
寫法會不一樣

本篇文章回覆於2017-10-09 14:27
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
11樓
回應

誰是誰
檢舉此回應
"類別傳遞的更明顯" <--- 這句話何意 ?
本篇文章回覆於2017-10-09 15:28
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
12樓
作者回應

city
檢舉此回應
To:誰是誰

哈哈 又被大大發現了
想來大大應該是很鑽研文字並謹慎的人
(從大大研讀MSDN就能略知一二)

早上看完[羅伯斯]大大提供的網頁後 突然有種想法
也不知道對不對 就胡亂的敲了一堆鍵盤說說自己的想法

後來再看一遍想說 我是在寫什麼鬼話
無奈Key出去的文字已經覆水難收了

其實我所說的:不寫上Shared的原因是要讓類別傳遞的更明顯
所指的只是:視覺上看過去比較明顯

由於是提供範例給版上各位大大看 因此希望能讓視覺更清楚一點

如下面範例 個人是認為Button1的表示方法比較清楚
(有個New)
事實上Button1 Button2的結果是一樣的




我所謂的視覺上看過去比較明顯 就是這個意思 :)
本篇文章回覆於2017-10-09 15:58
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
13樓
回應

浩瀚星空
捐贈 VP 給 浩瀚星空 檢舉此回應
依照你回應的「我覺得Class跟副程式其實沒什麼差別
把副程式寫成Class也是可以的」

我簡單說一下好了。

在vb.net中的sub也就是你所謂的副程式。
其實它是可以將其當為一個子CLASS的繼承處理。

這其實就又得討論何謂私有事件跟公有事件。
一般來說,如果說一個動作及一個事件。只有在一個按鍵上才有可能有的話。
一般來說就是直接寫在該按鍵的click事件就行了。
簡單明白。

但如果將其化出成為一個class。又感覺是很多餘的動作。

但是如果這個動作,可能會在其好幾個form中使用或是多個按鍵中都會用到。
那將其寫成一支class就一定不會有錯的。

將其按鍵各自繼承到此class上。以後只要改這一支class就行了。

不需要一個一個按鍵事件都去改

所以一般來說,事前的規劃書是很重要的。直接寫到元件內的事件或是寫一個公用的事件
都是得看你所有的需求來決定的。寫法並沒有對跟錯。
本篇文章回覆於2017-10-11 14:22
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
14樓
作者回應

city
檢舉此回應
To:浩瀚星空

感謝大大的說明

我會嘗試大大所說的:
[所謂的class就是代表一個零件。一個可以組合運用的東西]
本篇文章回覆於2017-10-12 11:40
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
[ 變換順序 ]   
1

回覆
如要回應,請先登入.