Discussion:
[問題] setXXX
(时间太久无法回复)
加油加油
2006-07-18 05:58:05 UTC
Permalink
請問一下,我發現在很多的API裡面,
在建立物件時,都不直接使用建構子來建立物件,
一些參數都要透過setXXX()的方法來給值,
請問使用這種方法有什麼好處嗎?
用建構子不是更方便嗎 謝謝...

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.228.200.146
加油加油
2006-07-18 06:41:42 UTC
Permalink
※ 引述《oishii (喔帥)》之銘言:
: ※ 引述《sioo (加油加油)》之銘言:
: : 請問一下,我發現在很多的API裡面,
: : 在建立物件時,都不直接使用建構子來建立物件,
: : 一些參數都要透過setXXX()的方法來給值,
: : 請問使用這種方法有什麼好處嗎?
: : 用建構子不是更方便嗎 謝謝...
: 應該是針對封裝性來做考量
: 一些instance variable在encapsulation的考量之下 應設為private
: 然後透過getXX()與setXXX()的method來做讀取與設定
: 利用這樣的方式可以避免一些錯誤的產生
: 比如說某一個instance variable必須為正數
: 在setter的方法內就可以做這樣的寫入限制
: 我也是初學者可能沒回答到你的問題
: 因為我搞不大懂constructor跟參數設定的關係為何
: 一般用new呼叫constructor產生一個instance之後應該就不會再呼叫建構子了
: 如果你的意思是說 建構子內用setter的方式來做設定
: 那裡由應該就是我上一段講的那樣
: 還請高手指教

不好意思,可能是我沒問清楚吧,譬如像google search的api

GoogleSearch search = new GoogleSearch();
search.setKey("000000000000000000000000");
search.setQueryString("Internet standards");
search.setSafeSearch(true);
GoogleSearchResult result = search.doSearch();

為什麼不乾脆寫一個建構子 GoogleSearch(key,query,isSafe)
這樣不是比較快嗎?為什麼還要用setXXX()的方法



--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.228.200.146
痞子軍團團長
2006-07-18 07:04:09 UTC
Permalink
※ 引述《sioo (加油加油)》之銘言:
: 請問一下,我發現在很多的API裡面,
: 在建立物件時,都不直接使用建構子來建立物件,
: 一些參數都要透過setXXX()的方法來給值,
: 請問使用這種方法有什麼好處嗎?
: 用建構子不是更方便嗎 謝謝...

這個問題問的好
之前還跟某台客高手爭執這件事情

也算是機緣巧合,不久之後就翻到書上的這段話
我引用如下,還希望作者不要介意


===============================================================
Spring 技術手冊 p.3-7

  至於要使用 Constructor 或 Setter 方法來完成依賴注入這個
問題,其實就等於在討論一個古老的問題:要在物件建立時就準備好
所有的資源,或是在物件建立好後,再使用 Setter 方法來進行設定


  使用 Constructor 的好處之一是,可以在建構物件的同時一併
完成依賴關係的建立,物件一建立後,它與其它物件的依賴關係也就
準備好了,但如果要建立的物件關係很多,使用 Constructor
injection 會在建構方法上留下一長串的參數,且不易記憶,這時使
用 Setter 方法會是個不錯的選擇。另一方面,Setter 方法具有明
確的方法名稱可以了解注入的物件匯是什麼,像是 setXXX() 這樣的
名稱,會比記憶 Constructor 上某個參數位置的索引代表某個物件
來得好,當結合 IDE 的方法提示功能使用時,撰寫程式會更方便且
有效率。

  然而使用 Setter 方法時,由於提供有 setXXX() 方法,所以不
能保證相關的資料成員或資源在執行時期不會被更改設定,因為程式
開發人員可能直接執行 Setter 方法來設定相關屬性,所以如果想要
讓一些資料成員或資源變為唯讀或是私有,使用 Constructor
injection 會是個簡單的選擇。

--
 侃侃長論鮮窒礙  網站:http://www.psmonkey.idv.tw
 眾目睽睽無心顫  個人版:telnet://legend.twbbs.org
 煢居少聊常人事 
 殺頭容易告白難  歡迎參觀 Java 版(@ptt.cc)精華區 \囧/

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 59.126.172.167
大口小口吃炒飯
2006-07-18 08:12:53 UTC
Permalink
※ 引述《sioo (加油加油)》之銘言:
: 請問一下,我發現在很多的API裡面,
: 在建立物件時,都不直接使用建構子來建立物件,
: 一些參數都要透過setXXX()的方法來給值,
: 請問使用這種方法有什麼好處嗎?
: 用建構子不是更方便嗎 謝謝...

如各位所說的,各有好壞吧

另外我想如果用constructor可以對必須給定的參數作強制輸入

畢竟參數不完全就不能呼叫constructor了,這樣在某些時候也可以省去一點麻煩

如果採用setter可能參數還不完全就呼叫某些動作必須多出很多檢查動作吧

另外一個情況是,如果class內的某些資訊必須在輸入完全參數後才計算得出來,

用constructor一次得到需要的參數應該也是比較方便的


setter/getter的好處我想其他大大也講了,

另外,會用setter/getter也可能是因為要拿去當javabean用吧~

----------------------------------------------

不過我覺得用 void XXX(Type)/ Type XXX() 這樣好像也不錯?

像是

Rectangle r=new Rectangle();
r.height(10); //set height to 10
r.width(5); //set width to 5
...
r.height(); //return 10
r.width(); //return 5

可以少打字 set/get XD

不過好像違反的一般java內method以動詞開頭的命名方式

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 219.86.96.11
so
2006-07-18 09:58:31 UTC
Permalink
在製作javabean的時候
會自動讀取setXXX/getXXX的方法
setXXX對javabean而就是一種設定XXX參數的方法
我是不知道有什麼特別的
不過在軟體開發的階段
把元件用javabean載入就很方便
可以直接透過介面修改這些參數值
※ 引述《cplusplus (大口小口吃炒飯)》之銘言:
: ※ 引述《sioo (加油加油)》之銘言:
: : 請問一下,我發現在很多的API裡面,
: : 在建立物件時,都不直接使用建構子來建立物件,
: : 一些參數都要透過setXXX()的方法來給值,
: : 請問使用這種方法有什麼好處嗎?
: : 用建構子不是更方便嗎 謝謝...
: 如各位所說的,各有好壞吧
: 另外我想如果用constructor可以對必須給定的參數作強制輸入
: 畢竟參數不完全就不能呼叫constructor了,這樣在某些時候也可以省去一點麻煩
: 如果採用setter可能參數還不完全就呼叫某些動作必須多出很多檢查動作吧
: 另外一個情況是,如果class內的某些資訊必須在輸入完全參數後才計算得出來,
: 用constructor一次得到需要的參數應該也是比較方便的
: setter/getter的好處我想其他大大也講了,
: 另外,會用setter/getter也可能是因為要拿去當javabean用吧~
: ----------------------------------------------
: 不過我覺得用 void XXX(Type)/ Type XXX() 這樣好像也不錯?
: 像是
: Rectangle r=new Rectangle();
: r.height(10); //set height to 10
: r.width(5); //set width to 5
: ....
: r.height(); //return 10
: r.width(); //return 5
: 可以少打字 set/get XD
: 不過好像違反的一般java內method以動詞開頭的命名方式

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 203.68.111.88
P***@mobbs.stut.edu.tw
2006-07-18 18:10:58 UTC
Permalink
set跟get有對物件下命令這層意義在

並不單單只是存取物件這麼簡單

而是要讓往後的使用者

容易了解某個方法到底在做些什麼

雖然沒有硬性規定 但為了延展性著想

遵守命名規則還是比較好的
Post by 加油加油
※ 引述《sioo (加油加油)》之銘言:
: 請問一下,我發現在很多的API裡面,
: 在建立物件時,都不直接使用建構子來建立物件,
: 一些參數都要透過setXXX()的方法來給值,
: 請問使用這種方法有什麼好處嗎?
: 用建構子不是更方便嗎 謝謝...
如各位所說的,各有好壞吧
另外我想如果用constructor可以對必須給定的參數作強制輸入
畢竟參數不完全就不能呼叫constructor了,這樣在某些時候也可以省去一點麻煩
如果採用setter可能參數還不完全就呼叫某些動作必須多出很多檢查動作吧
另外一個情況是,如果class內的某些資訊必須在輸入完全參數後才計算得出來,
用constructor一次得到需要的參數應該也是比較方便的
setter/getter的好處我想其他大大也講了,
另外,會用setter/getter也可能是因為要拿去當javabean用吧~
----------------------------------------------
不過我覺得用 void XXX(Type)/ Type XXX() 這樣好像也不錯?
像是
Rectangle r=new Rectangle();
r.height(10); //set height to 10
r.width(5); //set width to 5
....
r.height(); //return 10
r.width(); //return 5
可以少打字 set/get XD
不過好像違反的一般java內method以動詞開頭的命名方式
--
 ◣ ███ ███ ☆  Post by Pistachi 
 ◢█ ▉▉█ █▇█ ★ From 220-134-160-26.HINET-IP.hinet.net 
◥█◤ ﹉ ﹍ ﹋ 月光海洋BBS 《mobbs.stut.edu.tw》 163.26.220.130 
P***@mobbs.stut.edu.tw
2006-07-18 18:49:30 UTC
Permalink
Post by 加油加油
※ 引述《oishii (喔帥)》之銘言:
: 應該是針對封裝性來做考量
: 一些instance variable在encapsulation的考量之下 應設為private
: 然後透過getXX()與setXXX()的method來做讀取與設定
: 利用這樣的方式可以避免一些錯誤的產生
: 比如說某一個instance variable必須為正數
: 在setter的方法內就可以做這樣的寫入限制
: 我也是初學者可能沒回答到你的問題
: 因為我搞不大懂constructor跟參數設定的關係為何
: 一般用new呼叫constructor產生一個instance之後應該就不會再呼叫建構子了
: 如果你的意思是說 建構子內用setter的方式來做設定
: 那裡由應該就是我上一段講的那樣
: 還請高手指教
不好意思,可能是我沒問清楚吧,譬如像google search的api
GoogleSearch search = new GoogleSearch();
search.setKey("000000000000000000000000");
search.setQueryString("Internet standards");
search.setSafeSearch(true);
GoogleSearchResult result = search.doSearch();
為什麼不乾脆寫一個建構子 GoogleSearch(key,query,isSafe)
這樣不是比較快嗎?為什麼還要用setXXX()的方法
這問題很簡單啊...

拿key值來說

GoogleSearch這個類別產生後
並不是使用一次就回收的...

Key值會一再改變 假設改變的次數極大(一般來說是很大的...)

那麼利用建構子指定Key值這個動作 將不具任何意義...

能理解嗎...囧 (我都不知道自已在說什麼...該睡了...Orz)
--
 ◣ ███ ███ ☆  Post by Pistachi 
 ◢█ ▉▉█ █▇█ ★ From 220-134-160-26.HINET-IP.hinet.net 
◥█◤ ﹉ ﹍ ﹋ 月光海洋BBS 《mobbs.stut.edu.tw》 163.26.220.130 
小白退散!
2006-07-18 23:28:50 UTC
Permalink
※ 引述《***@ptt.cc (加油加油)》之銘言:
: ※ 引述《oishii (喔帥)》之銘言:
: : 應該是針對封裝性來做考量
: : 一些instance variable在encapsulation的考量之下 應設為private
: : 然後透過getXX()與setXXX()的method來做讀取與設定
: : 利用這樣的方式可以避免一些錯誤的產生
: : 比如說某一個instance variable必須為正數
: : 在setter的方法內就可以做這樣的寫入限制
: : 我也是初學者可能沒回答到你的問題
: : 因為我搞不大懂constructor跟參數設定的關係為何
: : 一般用new呼叫constructor產生一個instance之後應該就不會再呼叫建構子了
: : 如果你的意思是說 建構子內用setter的方式來做設定
: : 那裡由應該就是我上一段講的那樣
: : 還請高手指教
: 不好意思,可能是我沒問清楚吧,譬如像google search的api
: GoogleSearch search = new GoogleSearch();
: search.setKey("000000000000000000000000");
: search.setQueryString("Internet standards");
: search.setSafeSearch(true);
: GoogleSearchResult result = search.doSearch();
: 為什麼不乾脆寫一個建構子 GoogleSearch(key,query,isSafe)
: 這樣不是比較快嗎?為什麼還要用setXXX()的方法

用建構子取代Setter!!!?

還真是天才到讓人倒地的想法呀!

敢問兄臺, 以上例來說, 若用建構子, 是否每做一次查詢就必須重新create新的物件?

那就失去物件重複使用的便利性了.

因為建構子只能new呀!

每次都得強調, 物件產生和回收的成本是很高的, 這討論串看下來, 似乎大家都
沒這個sense. 居然都在Coding的方便性上打轉... Orz

以此例來說, 若作連續查詢, 其實我只要不斷改變QueryString()的屬性就好, 同一個
物件就可不斷幫我服務.

但若用建構子做這件事, 連續查詢, 我不但要連續產生不同的物件, 還必須每次都指定
Key和SafeSearch, 兩個每次都一樣的參數, 簡直跟智障一樣, 方便個鬼??

反正用建構子來取代所有參數的Setter, 物件只能用完就丟, 不如乾脆寫個Static的
method直接給參數拿結果還快些....

eg:

class GoogleSearch {
public static GoogleSearchResult doSearch(string Key,
string QueryString,
bool safeSearch) {
....
}
}

看到這樣的發問, 只能 oh, my god!



--
我主修物理
選修計概
副修離散
唉.....三修國文
--
╭──── Origin:<不良牛牧場> bbs.badcow.com.tw (210.200.247.200)─────╮
│  ↘ Welcome to SimFarm BBS -- From : [220.138.44.184] │
╰◣◣◢ ◢◢《不良牛免費撥接→電話:40586000→帳號:zoo→密碼:zoo》 ◣◣◢ ─╯
._.
2006-07-18 16:27:05 UTC
Permalink
那個, 我想...

他只是在抱怨為什麼沒有多一個建構子來讓他少打一開始的設定...

而非要用一個建構子取代掉部份或全部的 setter...

上面的看法是我認為大多數人的討論都是集中在下面這個主題的原因.

"一定會要 new 一個物件, 而那個物件的初值是要該用 setter 還是建構子給定"

希望在下的看法能稍微回應到你下面這三句.

※ 引述《***@bbs.badcow.com.tw (小白退散!)》之銘言:
(恕刪)
: 用建構子取代Setter!!!?

: 每次都得強調, 物件產生和回收的成本是很高的, 這討論串看下來, 似乎大家都
: 沒這個sense. 居然都在Coding的方便性上打轉... Orz

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 163.25.148.49
大家來創社 ^^//
2006-07-19 04:22:53 UTC
Permalink
※ 引述《***@ptt.cc (加油加油)》之銘言:
: ※ 引述《oishii (喔帥)》之銘言:
: : 應該是針對封裝性來做考量
: : 一些instance variable在encapsulation的考量之下 應設為private
: : 然後透過getXX()與setXXX()的method來做讀取與設定
: : 利用這樣的方式可以避免一些錯誤的產生
: : 比如說某一個instance variable必須為正數
: : 在setter的方法內就可以做這樣的寫入限制
: : 我也是初學者可能沒回答到你的問題
: : 因為我搞不大懂constructor跟參數設定的關係為何
: : 一般用new呼叫constructor產生一個instance之後應該就不會再呼叫建構子了
: : 如果你的意思是說 建構子內用setter的方式來做設定
: : 那裡由應該就是我上一段講的那樣
: : 還請高手指教
: 不好意思,可能是我沒問清楚吧,譬如像google search的api
: GoogleSearch search = new GoogleSearch();
: search.setKey("000000000000000000000000");
: search.setQueryString("Internet standards");
: search.setSafeSearch(true);
: GoogleSearchResult result = search.doSearch();
: 為什麼不乾脆寫一個建構子 GoogleSearch(key,query,isSafe)
: 這樣不是比較快嗎?為什麼還要用setXXX()的方法

一方面是參數列過長的問題;另一方面是可讀性的問題

MySearch search = new MySearch("000000000000000000000000",
"Internet standards", true);
這一段程式碼,就算是程式開發人員,看到建構子有兩個字串,和一個布林參數
腦子不先揪成一團,也會先變成兩個大...
誰知道第一個參數和第二個參數的意義是什麼呢...

String key = "000000000000000000000000";
String queryString = "Internet standards";
Boolean safeSearch = true;
MySearch search = new MySearch(key, queryString, safeSearch);
這一段程式碼看起來好多了,至少各個變數都已充分地描述自身的意義
但是這將延伸另一個可能的問題,每當追朔這些變數的時候 (key, queryString, ...)
總是無法和 search 聯想在一塊兒...
只有在看到第四行的時候,才發現:原來這些變數是要拿來建構 search 的啊!

MySearch search = new MySearch();
search.setKey("000000000000000000000000");
search.setQueryString("Internet standards");
search.setSafeSearch(true);
這一段程式碼最能看出各個變數的關係和意義
"000000000000000000000000" 是要拿來給 search 當成 key 的
"Internet standards" 是要拿來給 search 當成 queryString 的
而 search 是 safe search 的
整個一目瞭然!

不只如此,在撰寫程式碼的時候
適當地使用 setter 和 getter 也能減少 debug 的時間
當一個 field 出現預期之外的問題時,標出那個 field 的所有 setter 和 getter
將能減少花在 "varible = ...;" 和 "... = varible;" 的時間
只要追朔這些 setter 和 getter 就可以了

--

希望這些資訊能提供給您一些幫助

--
〒作者:H45 來自:85-205.dorm.ncu.edu.tw
◎二進位的世界【140.115.50.50‧binary.csie.ncu.edu.tw】
P***@mobbs.stut.edu.tw
2006-07-19 04:27:05 UTC
Permalink
或許在狀況外的人是你唷...
有沒有好好的看別人的文章?

我相信原PO也知道這個"常識"
他只是在報怨 為啥不"多"個建構子
可以輸入參數....

隨便就說別人沒sence...
唔 是不對的 囧
Post by 小白退散!
: 不好意思,可能是我沒問清楚吧,譬如像google search的api
: GoogleSearch search = new GoogleSearch();
: search.setKey("000000000000000000000000");
: search.setQueryString("Internet standards");
: search.setSafeSearch(true);
: GoogleSearchResult result = search.doSearch();
: 為什麼不乾脆寫一個建構子 GoogleSearch(key,query,isSafe)
: 這樣不是比較快嗎?為什麼還要用setXXX()的方法
用建構子取代Setter!!!?
還真是天才到讓人倒地的想法呀!
敢問兄臺, 以上例來說, 若用建構子, 是否每做一次查詢就必須重新create新的物件?
那就失去物件重複使用的便利性了.
因為建構子只能new呀!
每次都得強調, 物件產生和回收的成本是很高的, 這討論串看下來, 似乎大家都
沒這個sense. 居然都在Coding的方便性上打轉... Orz
以此例來說, 若作連續查詢, 其實我只要不斷改變QueryString()的屬性就好, 同一個
物件就可不斷幫我服務.
但若用建構子做這件事, 連續查詢, 我不但要連續產生不同的物件, 還必須每次都指定
Key和SafeSearch, 兩個每次都一樣的參數, 簡直跟智障一樣, 方便個鬼??
反正用建構子來取代所有參數的Setter, 物件只能用完就丟, 不如乾脆寫個Static的
method直接給參數拿結果還快些....
class GoogleSearch {
public static GoogleSearchResult doSearch(string Key,
string QueryString,
bool safeSearch) {
....
}
}
看到這樣的發問, 只能 oh, my god!
--
 ◣ ███ ███ ☆  Post by Pistachi 
 ◢█ ▉▉█ █▇█ ★ From 220-134-158-132.HINET-IP.hinet.net 
◥█◤ ﹉ ﹍ ﹋ 月光海洋BBS 《mobbs.stut.edu.tw》 163.26.220.130 
小白退散!
2006-07-19 12:06:27 UTC
Permalink
若是這樣, 那我真是太對不起大家了...

先向大家致歉一下

※ 引述《***@mobbs.stut.edu.tw ()》之銘言:
: 或許在狀況外的人是你唷...
: 有沒有好好的看別人的文章?
: 我相信原PO也知道這個"常識"
: 他只是在報怨 為啥不"多"個建構子
: 可以輸入參數....
: 隨便就說別人沒sence...
: 唔 是不對的 囧
: ※ ***@bbs.badcow.com.tw (小白退散!) wrote:
: > 用建構子取代Setter!!!?
: > 還真是天才到讓人倒地的想法呀!
: > 敢問兄臺, 以上例來說, 若用建構子, 是否每做一次查詢就必須重新create新的物件?
: > 那就失去物件重複使用的便利性了.
: > 因為建構子只能new呀!
: > 每次都得強調, 物件產生和回收的成本是很高的, 這討論串看下來, 似乎大家都
: > 沒這個sense. 居然都在Coding的方便性上打轉... Orz
: > 以此例來說, 若作連續查詢, 其實我只要不斷改變QueryString()的屬性就好, 同一個
: > 物件就可不斷幫我服務.
: > 但若用建構子做這件事, 連續查詢, 我不但要連續產生不同的物件, 還必須每次都指定
: > Key和SafeSearch, 兩個每次都一樣的參數, 簡直跟智障一樣, 方便個鬼??
: > 反正用建構子來取代所有參數的Setter, 物件只能用完就丟, 不如乾脆寫個Static的
: > method直接給參數拿結果還快些....
: > eg:
: > class GoogleSearch {
: > public static GoogleSearchResult doSearch(string Key,
: > string QueryString,
: > bool safeSearch) {
: > ....
: > }
: > }
: > 看到這樣的發問, 只能 oh, my god!

--
我主修物理
選修計概
副修離散
唉.....三修國文
--
╭──── Origin:<不良牛牧場> bbs.badcow.com.tw (210.200.247.200)─────╮
│  ↘ Welcome to SimFarm BBS -- From : [59.112.97.184] │
╰◣◣◢ ◢◢《不良牛免費撥接→電話:40586000→帳號:zoo→密碼:zoo》 ◣◣◢ ─╯
._.
2006-07-19 05:07:45 UTC
Permalink
基本上我覺得 Contractman. 那方向的討論也是很好的,

所以我只是推測說大部分的人可能是那樣想.

並沒有說他不要繼續往那邊討論阿... orz

我也沒有說他錯... 你想回的那個在那邊這樣...

※ 引述《***@bbs.wretch.cc (飛)》之銘言:
: 除了語氣衝一點之外,
: Contactman沒說錯啥阿,
: 原po問的例子
: GoogleSearch search = new GoogleSearch();
: search.setKey("000000000000000000000000");
: search.setQueryString("Internet standards");
: search.setSafeSearch(true);
: GoogleSearchResult result = search.doSearch();
: 沒一個像是用來initialized的參數。
: ※ 引述《***@ptt.cc (._.)》之銘言:
: > 那個, 我想...
: > 他只是在抱怨為什麼沒有多一個建構子來讓他少打一開始的設定...
: > 而非要用一個建構子取代掉部份或全部的 setter...
: > 上面的看法是我認為大多數人的討論都是集中在下面這個主題的原因.
: > "一定會要 new 一個物件, 而那個物件的初值是要該用 setter 還是建構子給定"
: > 希望在下的看法能稍微回應到你下面這三句.
: > (恕刪)

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 163.25.148.49
P***@mobbs.stut.edu.tw
2006-07-19 16:16:14 UTC
Permalink
Post by P***@mobbs.stut.edu.tw
set跟get有對物件下命令這層意義在
並不單單只是存取物件這麼簡單
而是要讓往後的使用者
容易了解某個方法到底在做些什麼
雖然沒有硬性規定 但為了延展性著想
^^^^^^^^^^^^^^^^^
誰告訴你的?
Java Bean 絕對要遵守這個getter/setter規則。
要不然 JSTL useBean的getProperty 跟setProperty完全不能動。
Post by P***@mobbs.stut.edu.tw
遵守命名規則還是比較好的
但是"語法中"並沒有硬性規定吧?
也沒有一定要用Java Bean吧?
那我在寫C++時使用setter/getter規則該怎麼解釋?
這只是想解釋一個概念...
或許表達的不好...不要這麼計較嘛 Orz
--
 ◣ ███ ███ ☆  Post by Pistachi 
 ◢█ ▉▉█ █▇█ ★ From 220-134-160-26.HINET-IP.hinet.net 
◥█◤ ﹉ ﹍ ﹋ 月光海洋BBS 《mobbs.stut.edu.tw》 163.26.220.130 
不務正業工程師
2006-07-19 10:37:05 UTC
Permalink
※ 引述《***@mobbs.stut.edu.tw ()》之銘言:
: ※ ***@bbs.wretch.cc (飛) wrote:
: > ^^^^^^^^^^^^^^^^^
: > 誰告訴你的?
: > Java Bean 絕對要遵守這個getter/setter規則。
: > 要不然 JSTL useBean的getProperty 跟setProperty完全不能動。
: 但是"語法中"並沒有硬性規定吧?
: 也沒有一定要用Java Bean吧?
: 那我在寫C++時使用setter/getter規則該怎麼解釋?
: 這只是想解釋一個概念...
: 或許表達的不好...不要這麼計較嘛 Orz

或許也可以把 Java Bean 的"習慣性用法"當成一種 Pattern 吧
我覺得倒沒什麼誰對誰錯...

何況很多以前大家認為錯的,現在又是那麼的理所當然...

Pattern Refactory後,又是一種新的Pattern不是嗎?

--
◤城市.角落◢「簡單的說,這座城市一點都不美。幸好有某些傻瓜存在。」

        ID:CHIEN-HSIANG  工作只是生活的輔助,而不是全部
        Basketball - Program - Read - Movie - Lifeful

        ◎職業:不務正業工程師 Java DotNet System Analyse & Design

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.135.0.243
該換個重訓方法了
2006-07-19 18:29:52 UTC
Permalink
※ 引述《ChienHsiang (不務正業工程師)》之銘言:
: ※ 引述《***@mobbs.stut.edu.tw ()》之銘言:
: : 但是"語法中"並沒有硬性規定吧?
: : 也沒有一定要用Java Bean吧?
: : 那我在寫C++時使用setter/getter規則該怎麼解釋?
: : 這只是想解釋一個概念...
: : 或許表達的不好...不要這麼計較嘛 Orz
: 或許也可以把 Java Bean 的"習慣性用法"當成一種 Pattern 吧
: 我覺得倒沒什麼誰對誰錯...
: 何況很多以前大家認為錯的,現在又是那麼的理所當然...
: Pattern Refactory後,又是一種新的Pattern不是嗎?

物件導向概念裡頭,有個大家都知道,卻都常忽略的概念,就是「封裝」。
這東西簡單來說,就是類別中的變數,不能給其他類別直接存取,而必須
提供setter/getter來設定或取得「變數值」。
(注意!直接操作變數與間接取值是完全不同的兩回事)

這做法可以讓類別設計者能保留程式內容的彈性,當需求有變時,只需更改
類別內部對變數操作的方法,不用讓引用此類別的程式區段同時做修改。

至於為什麼要用setXXX以及getXXX。

如果某人的Java類別沒有重複利用的價值,那麼setXXX/getXXX改為任何有效的
方法名稱都可以。可是,如果這個類別有重複利用的可能,而且不知道會在
哪個領域用到,則採用getXXX/setXXX反而可以讓這隻類別提供Java Bean的功能。

不過之所以用set/get來當字首,簡單來說就是短、簡潔、易記。試想一下,
如果改用assignXXX/fetchXXX,是不是覺得很累綴哩?依學習以及使用的觀點
來看用set/get的確是種行為正確的選擇。

希望這些能解答討論串原PO的疑惑。

--
No Dying Skills, ● - Dame! New tech...
but Lazy Users. .\)
http://hougzou.spaces.msn.com/ _____________ ﹒ ︵ √\ ___________________

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.129.165.230
加油加油
2006-07-20 07:37:01 UTC
Permalink
謝謝版上的各位大大給我詳細的觀念,看了各位的
回答,我覺得很高興又多學了一課,那時候沒想到
使用setter是為了重複利用物件,現在終於清楚建構
子與setter這兩種方式的差別

感謝這麼多人的熱烈回應,小弟受教了.......

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.228.200.146
推 PsMonkey:感謝文... 比照辦理  07/20 23:36
小白退散!
2006-07-21 13:00:44 UTC
Permalink
ㄜ....

還有人認為是我在狀況外嗎? 還認為我誤會原PO?

唉...

※ 引述《***@ptt.cc (加油加油)》之銘言:
: 謝謝版上的各位大大給我詳細的觀念,看了各位的
: 回答,我覺得很高興又多學了一課,那時候沒想到
: 使用setter是為了重複利用物件,現在終於清楚建構
: 子與setter這兩種方式的差別
: 感謝這麼多人的熱烈回應,小弟受教了.......

--
我主修物理
選修計概
副修離散
唉.....三修國文
--
╭──── Origin:<不良牛牧場> bbs.badcow.com.tw (210.200.247.200)─────╮
│  ↘ Welcome to SimFarm BBS -- From : [59.112.105.240] │
╰◣◣◢ ◢◢《不良牛免費撥接→電話:40586000→帳號:zoo→密碼:zoo》 ◣◣◢ ─╯
Loading...