台灣最大程式設計社群網站
線上人數
1570
 
會員總數:240909
討論主題:186668
歡迎您免費加入會員
討論區列表 >> VB.NET >> 重複的程式碼該如何處理?
[ 變換順序 ]  
[我要回覆]
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
重複的程式碼該如何處理?
價值 : 50 QP  點閱數:351 回應數:20

樓主

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

請問各位大大們:

(以下若有錯誤請指正)

這兩項是我對程式碼的認知:
1.Class最好能夠單獨完成作業 避免依賴其他Class
2.避免重複的程式碼


以下為我對重複程式碼解決的方法:
1.不處理(就讓重複程式碼存在) (這違背了第二點:避免重複的程式碼)
2.將重複程式碼寫成Sub 放到a.模組 b.各自的Class c.共用的Class (這有可能違背第一點:獨立的Class)


方法一 不處理重複的程式碼



方法二 寫入模組

[問題一](額外問的)
呼叫模組的Sub (理論上)前面應該要加上模組的名稱吧?

(只是應該很多人都不會加)
(如果硬要模組的變數 屬性 Sub前面加上模組名稱 使用上應該就變得跟Class一樣不便...)



方法三 寫入各自的Class
如果Class1將重複的程式碼寫成Sub放在Class1裡面
Class2無法使用Class1裡面的Sub



方法四 寫入共用Class


以上:
[方法一 不處理重複的程式碼]
1.這個方法的獨立性很好
2.可是會有重複的程式碼

[方法二 寫入模組]
1.這個方法獨立性有問題(需要呼叫模組)
2.沒有重複的程式碼

[方法三 寫入各自的Class]
1.這個方法的獨立性很好
2.可是會有重複的程式碼(Class2的程式碼 跟Class1的DD重複)

[方法四 寫入共用Class]
1.這個方法獨立性有問題(需要呼叫Class3)
2.沒有重複的程式碼


[問題二]
方法二需要呼叫模組 方法四需要呼叫Class3
這代表如果別的專案需要使用到Claa1或Class2 需要把模組或Class3一起打包過去 不然會出問題
這樣的問題該如何解決?

[問題三]
大大們遇到像這樣重複的程式碼 都是如何處理的呢?

謝謝~~

搜尋相關Tags的文章: [ VB.NET ] , [ 重複 ] , [ 程式碼 ] ,
本篇文章發表於2017-10-02 12:12
別忘捐VP感謝幫助你的人 新手會員瞧一瞧
1樓
作者回應

city
檢舉此回應
補充說明:

以上的範例只是簡單寫一下 主要是想表達寫程式時 常常會遇到重複的程式碼 這時候該如何處理這些重複的程式碼就蠻重要了

或許該怎麼處理重複程式碼沒有一定標準?(還是其實有?)

只是想知道大多數人是如何做的 然後依照大多數人的做法來操作



另外:
"各自的程式碼"沒寫好 都寫成MessageBox.Show
應該是不同的內容 例如:
Sub AA
MessageBox.Show("資料夾的路徑" & s)

Sub BB
Process.Start(s)

Sub CC
Me.Text=s
本篇文章回覆於2017-10-02 13:09
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
回應

浩瀚星空
捐贈 VP 給 浩瀚星空 檢舉此回應
這邊得要看你如何去看待何謂叫重覆的程式碼。

如我開發的遊戲模組中

我大多會用一個Game做為主模組。
然後將各自的遊戲class用如 Game_g1、Game_g2、Game_g3......
並繼承Game

再各自的遊戲class內,都會有其可以說是一樣的的play方法的程式碼,只是達行路徑的不同
如 url('????/g1') 等運行的方式

原則上,這就得看其需求性來決定了。

如果說所有的遊戲都是url的方式請求。一般來說這樣子放在各遊戲class就會覺得多此一舉。也可以叫做所謂的重覆的程式碼。
一般來說,我大多會寫入到Game的主遊戲class來供其它子class呼叫。

但是為何還是需要分開的原因。是因為有可能會有不同的請求方式。有可能是10支遊戲中,只有其一的遊戲呼叫不同。

這時候,站在mvc架構的原理情況下。雖然其9支game class的play語法是相同的,只有一支不同。
但我並不會將其視為重覆的程式碼。也不會去做特別的判斷。
本篇文章回覆於2017-10-02 14:49
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
作者回應

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

大大的內容看過很多遍 不過還是不太懂
[url的方式請求]
[mvc架構的原理]
這些我沒接觸過 所以聽不太懂...

大大的意思是所有欄位 屬性 方法都放在ClassGame裡面
然後其他的Class來繼承ClassGame嗎?

這樣ClassGame裡面的東西不會太多嗎?
(感覺裡面塞了好多東西...)



重覆的程式碼...我想比較實際的說法應該就是副程式(Sub)+函式(Function)
因為重複的程式碼都被我切割出來放進Sub或Function裡面了
(之前寫程式都是用程序導向的寫法 重複的程式碼都被我分割成了Sub或Function)

現在嘗試用Class來寫
不過Class裡的方法還是需要呼叫這些副程式+函式
(就像我的方法四那樣)
本篇文章回覆於2017-10-03 11:39
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
不錯的參考

浩瀚星空
捐贈 VP 給 浩瀚星空 檢舉此回應
url的說明只是一種舉例。代表的可能是轉向頁之類的動作或是處理。

我上面其實有說了,一種是零件式的宣告手法。
所以在classgame賽的東西多是沒關係的。

因為這樣子做的目的,是抽換容易方便。
就如我目前做的遊戲有好幾百種,且各自運行的方式都略有不同,但絕大多數都相同。
如果想要不要有重覆程式碼,就得要做判斷式來處理。
但這樣並沒辦法很有效的達到替換方便處理。

所以自然會將一些相關的做法語法,也一樣寫到ClassGame內。
但這樣我並不會將其視為重覆的程式碼。而是零件中的一環。

對我來說,所謂的重覆程式碼,是指在同一個class或是function或是controllers中,出現了相同的對應使用語法。
基本上如果是簡短的處理還無所謂,但如果是高達10~20行以上的程式碼,我就會覺得這是多餘的。
雖然在正常的做法,大多來說還是會將其化成function來處理。

但如果是用class,就不一定會將其視為多餘的程式碼。

其實如果你對於mvc的架構原理還不了解的情況下。
可能會比較聽不太懂我的說法。

以下就先針對你的問題回答一下,上面的內容你在看看能不能消化

「大大的意思是所有欄位 屬性 方法都放在ClassGame裡面
然後其他的Class來繼承ClassGame嗎?

這樣ClassGame裡面的東西不會太多嗎?
(感覺裡面塞了好多東西...)」

並不完全對,共用性的動作指令才會寫到ClassGame內。而在SubClass中,則是將一些有可能不會共用的指令方式命令各自分開寫。
不過就如你說的,這樣在其SubClass會有很多個方法屬性存在。但這樣在抽換時會比較方便處理

像我目前的做法就是會在其SubClass內有個init的方法。而在載入的同時就連帶在其ClassGame中做登記了。
所以我今天假設有 a b c d e 等遊戲。在初始化的同時就會載入對應。
但如果我今天突然a遊戲不要了。我並不需要去修改程式碼。
只要將a的SubClass拿掉就行了。

如果說我今天是用另外一種方式,為了要省程式碼,我可能得要在屬性或是方法的載入應用中,要寫其判斷。
但如果我抽掉了其中一項遊戲,我就得將其判斷重新修改。這也是一件很麻煩的事。

==============================
「(之前寫程式都是用程序導向的寫法 重複的程式碼都被我分割成了Sub或Function」
早期的程式寫法的確是這樣,我之前有帶個一個阿弟啊,他以為寫成sub跟function就是框架。
我那時就有跟他說了,這並不是框架的寫法,勉強只能說是一種結構化的寫法。
真要說他是一個框架,其實也不是不行,只是這樣的方式其實離所謂的框架還是有一大截的。

class的應用還是最好學一下。學完後你會發現並沒有所謂的重覆程式碼的問題存在。

至於class跟functio的差別性在哪呢???
真要勉強說的話,我想想該用什麼來比喻。

class就像是車床,只要有設計圖就可以做出不錯的東西。且其設計圖可以永久保留。

而function就像是工具,如鋸子、鐵槌...。也就可以拿來製做東西。
只是製做完後。其並沒有所謂的設計圖。不會有記錄。

其實這樣的比對也並不完全是對的。

因為class的特性除了本身參數是獨立性。也有其複製對應的特性。
用最簡單的原理好了。如sql的db應用。

class可以用同一個物件來宣告到不同的參數內。
function則因為程式碼是共用的因素。所以你只能用不同的設定值來區分不同的資料庫。
本篇文章回覆於2017-10-03 12:11
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
作者回應

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

我想了一下 寫了個簡單的程式請教一下大大:

1.以下的範例 大大會認為[新增資料夾]這個副程式是重複的程式碼嗎?
2.大大會把[新增資料夾]拉出來變成共用的副程式嗎? (如果拉出來的話 這個副程式該放哪?)
3.這個範例如果請大大來修改 會改成什麼樣子?
謝謝~~


本篇文章回覆於2017-10-03 20:56
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
6樓
最有價值解答

Zeeman
檢舉此回應
給你一個觀念

在討論重複的程式碼要怎麼處理之前

要先看這個程式碼的應用範圍

然後回頭再來看看你的資料夾範例

依你的例子,跟本就不用想太多


再來就是如果你每個類似的類別都有這樣的屬性行為
你可以有兩個選擇
一個是把上面這個寫在base class中,大家去繼承它
另一個是改變你的s指定方法,不要寫在本身class的Property
把s寫成另一個物件,然後class的AA BB CC在呼叫時,傳入這個物件


給別的Class用

這都是應用的方法之一
你的s是否在建Class後還需要改變
或是你的Class AA BB CC那些行為是不是可以再分類都是另外的議題,也可能影響到MyPath是否應這樣做
一切看實際情況而定

PS:C#用久了VB.net的語法我有點忘了,如果以上有語法上的問題,請自行修正
本篇文章回覆於2017-10-04 00:21
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
7樓
回應

Zeeman
檢舉此回應
發現MyPath的Public Property s As String有問題,要改ReadOnly
本篇文章回覆於2017-10-04 00:24
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
8樓
回應

浩瀚星空
捐贈 VP 給 浩瀚星空 檢舉此回應
依照#5你的程式碼,我的確會將其視為重覆的程式碼。
但是你可以參考 Zeeman大的寫法。

這其實就是我之前上面說的,用一個主class來處理共用性的方法,子class繼承主class。
之後的動作就是直接呼叫主class的方式。

其實所謂的重覆程式碼,另外一個目的就是簡化程式碼跟未來維護方面的思考。

像你#5的程式碼,假設日後有可能會需要做變動的情況,就你得去改3個地方。這樣是一件很麻煩的事。

基本上來說,我用白話點的說法就是會將其區分為「命令」跟「行為」還有「做法」

命令是固定死的不變。如(增加一個記錄檔)

行為則是可能需要指定目的地或是人事物。一般就是給命令加上行為的處理
如剛剛的「增加一個記錄檔」套進去行為可能是用「時」(今日)。則變成「增加一個今日記錄檔」
一般這是參數的行為。

但「做法」就又分成很多種做法。如產生的檔名不同,
可能是存「年月日.log」這樣的檔案。但也可能會存成「年月日時分.log」這樣的檔案
但這些做法都是符合上面的「命令」跟「行為」。

也就是說,我們可以把做法化成一個地方。無論在任何地方呼叫了這個命令。就是統一運行這個做法。
能當命令的動作,一定是不會改變的命令。
本篇文章回覆於2017-10-05 12:12
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
9樓
作者回應

city
檢舉此回應
To:Zeeman

覺得大大提供的方法很神奇 以前沒想過這樣寫程式
覺得物件導向的程式碼跟傳統程序導向的程式碼差很多
(感覺像是物件導向程式碼越走越偏了...)(誤)

(以前對程式碼的認知是:If..Then Do..Loop Select..Case 陣列 副程式 函式 ...)
(現在物件導向變成了:命名空間 介面 類別 物件 欄位 屬性 方法 事件 委派 繼承 多型 泛型 ...)
(以前是Byval參數 現在連類別都可以Byval了...)


試了一下大大提供的方法:

第一種是屬性的Set裡面包含了新增資料夾
(這方法真神奇 屬性裡面還可以新增資料夾)

第二種是把副程式[新增資料夾] 改成了類別
變成類別[新增資料夾]
然後這個類別可以像球一樣的被傳來傳去(Byval來 Byval去)

(ReadOnly屬性的值能夠被New設定 這也蠻特別的...)
(這好像有點不太合乎邏輯 都已經說是唯讀了...)


還是有些疑問:

第一種方式:
把屬性寫在BaseClass裡面 大家去繼承它
Form1無法繼承Class
Class如果繼承了Form1 Class裡面會有一大堆Form1的東西
所以是Class繼承Class?

第二種方法:
副程式改成類別
如果我要用到10個副程式 那就把這10個副程式改成10個類別?
本篇文章回覆於2017-10-05 20:48
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
10樓
作者回應

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

[#5]
大大的意思是一個主要的ClassGame
然後Class1 Class2 Class3繼承ClassGame
Class1 Class2 Class3裡面都有一個Sub Play

如果Class1 Class2 Class3的Play裡面的程式碼一模一樣
就把Play放在ClassGame裡面
(Class1 2 3 裡面就沒有Play)

如果Class1 Class2 Class3的Play裡面的程式碼有一個跟別人不一樣
就把Play放在Class1 Class2 Class3裡面
(ClassGame 裡面就沒有Play)

是這個意思嗎?
本篇文章回覆於2017-10-05 21:04
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
11樓
作者回應

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

上面[#5]打錯了 應該是[#2]
是回應2樓的內容


[#4]
[對我來說,所謂的重覆程式碼,是指在同一個class或是function或是controllers中,出現了相同的對應使用語法。]
所以大大覺得不同的Class裡面有重複的程式碼 不算是重複的程式碼?
大大的意思是這樣嗎?

[雖然在正常的做法,大多來說還是會將其化成function來處理。]
[但如果是用class,就不一定會將其視為多餘的程式碼。]
所以大大的意思是:就算是同一個Class裡面有重複的程式碼 大大還是不管它?

結合上面兩個 也就是說大大都不處理重複的程式碼?
(Form1對大大來說算是Class嗎?)
(Form1裡面重複的程式碼也不處理?)


如果Class1 Class2 Class3繼承ClassGame
Class1 2 3 裡面有Sub Play1 Play2 Play3
其中Play1的內容三個Class都一樣
Play2 Play3的內容三個Class有差異

那ClassGame裡面有Play1
Class1 2 3 裡面有Play2 3
是這個意思嗎?


[class的應用還是最好學一下。學完後你會發現並沒有所謂的重覆程式碼的問題存在。]
這句話我覺得不錯 會慢慢體會的 ^^
本篇文章回覆於2017-10-05 21:35
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
12樓
作者回應

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

[#8]
[其實所謂的重覆程式碼,另外一個目的就是簡化程式碼跟未來維護方面的思考。]
我就是想簡化程式碼所以才會想把3個副程式抽出成1個副程式
(新增一個共用Class 把副程式放進去)
(如同#1的第四個方法)

可是這樣 如果別的專案想要使用Class1 會變成會缺少Class3



如果大大說不同的Class裡面有重複的程式碼不算是重複程式碼的話
(不知道是不是我的誤解?)

那五樓的範例就不算是重複的程式碼?
(修改起來的確要修改3個地方...)



「命令」「行為」「做法」
這部分內容我目前還無法體會 需要時間消化一下... ^^
本篇文章回覆於2017-10-05 21:56
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
13樓
回應

Zeeman
檢舉此回應
[quote]
還是有些疑問:

第一種方式:
把屬性寫在BaseClass裡面 大家去繼承它
Form1無法繼承Class
Class如果繼承了Form1 Class裡面會有一大堆Form1的東西
所以是Class繼承Class?

第二種方法:
副程式改成類別
如果我要用到10個副程式 那就把這10個副程式改成10個類別?
[quote]
你真的要先去體會一下浩瀚星空說的「命令」「行為」「做法」
你可以買「深入淺出物件導向分析與設計」這本書來看,雖然他是用Java當範例
依VB.net來說,非必最好少是直接用繼承來做,因為一個Class只可以繼承一個父類別
這個如果你開始寫繼承就可能會遇到了,這時你要回頭檢視自己的分類是不是出了問題
缺少了什麼觀念,或是用設計模式來解決

我說的第一種方式寫成一個父Class要先想好是不是適合


你第二個問題是你的物件導向觀念的問題
建議你可以先買本「深入淺出物件導向分析與設計」不過他不是用VB.net來寫範例的
但應該是都看得懂,主要他的思考方向你要先跟著走一次
設計模式那本最好等物件導向大概有念後再來看,慢慢來,一步一步實作
一定都會遇到問題,再來討論分析
本篇文章回覆於2017-10-05 22:33
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
14樓
作者回應

city
檢舉此回應
To:Zeeman

感謝大大的範例以及推薦的書

想說是不是該去看一下C C++ C# JAVA的書
這樣看對於物件導向的觀念會不會有幫助

或是用VB.NET的主控台應用程式來練習Class之間的互動
這樣才不會都把程式碼寫在Form的Button_Click裡面
(用Form工具箱裡面的物件寫程式 通常用程序導向+副程式+函式就能把程式寫完)
本篇文章回覆於2017-10-06 21:05
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
15樓
回應

Zeeman
檢舉此回應
你現在對一個語言還不是很熟
不建議再去寫別的語言
VB.net一樣也有物件導向

不過如果你非工作必要用VB.net的話,可以轉用C#來開發

接下來就是了解物件導向的觀念
同時加強你對VB或C#語言的熟悉度
再來多看別人寫的Source

已經在工作的話,就先從工作要用的學起
公司也一定有別人寫的code,就拿來K,看不懂就去查到懂

現在Microsoft也開始在走OpenSource
所以Github應該也有不少的範例
看高手寫一套,進步會很神速

我不是走純MS的,所以只能建議到這



本篇文章回覆於2017-10-06 21:56
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
[ 變換順序 ]   

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