แสดงดีกว่า () + ซ่อน () หรือ SetVisible (มองเห็นบูล) หรือไม่


59

ดีกว่าอะไรและเพราะอะไร (จากมุมมองของการออกแบบอินเตอร์เฟส):

a) มีสองShow()และHide()ฟังก์ชั่น

b) การมีSetVisible(bool visible)ฟังก์ชั่นเดียว

แก้ไข: ตัวอย่างเช่นวัตถุบางอย่างมีสถานะการมองเห็นและฟังก์ชั่นนี้จะใช้ในการเปลี่ยนแปลง

ค) มีทั้งสามShow(), Hide(), SetVisible(bool visible)ฟังก์ชั่น


4
ในบริบทใด โดยทั่วไปแล้วมันไม่สำคัญ
Aviv Cohn


6
ทำไมพวกเขาถึงไม่เปิดเผยต่อสาธารณะทั้งหมด? มีหลายกรณีที่คุณรู้ว่าพวกเขาจะถูกแสดงหรือซ่อนอยู่เสมอและมีหลายกรณีที่คุณต้องการแสดงหรือซ่อนตามเงื่อนไข
พล

@pllee: นั่นอาจเป็นจุดที่ดีมาก
user3123061

4
ใน java มันจะเป็น setVisible, ซ่อนและแสดงโดยไม่มีตัวอักษรตัวใหญ่เริ่มต้น
Pierre Arlaud

คำตอบ:


81

ฉันชอบSetVisible(bool visible)เพราะมันช่วยให้ฉันเขียนรหัสลูกค้าเช่นนี้:

SetVisible(DetermineIfItShouldBeVisible());

แทนที่จะต้องเขียน

if (DetermineIfItShouldBeVisible()) {
    Show();
} else {
    Hide();
}

SetVisibleวิธีนอกจากนี้ยังอาจช่วยให้สำหรับการดำเนินงานได้ง่ายขึ้น ตัวอย่างเช่นถ้าคลาสคอนกรีตเฉพาะมอบหมายวิธีการให้กับคลาสคอมโพสิตแล้วก็SetVisibleหมายถึงวิธีหนึ่งน้อยกว่าที่จะใช้

void ButtonWithALabel::SetVisible(bool visible) {
    myButton.SetVisible(visible);
    myLabel.SetVisible(visible);
}

25
เท่ากับคุณสามารถทำให้ทรัพย์สินมองเห็นได้โดยสมมติว่าภาษาของคุณรองรับ MyObject.Visible = false;ทำให้ฉันเป็นคนที่เข้าใจง่ายกว่าMyObject.SetVisible(false);
Brian

9
@Brian สำหรับฉันมันอ่านได้น้อยและ debuggable เพราะมันซ่อนพฤติกรรมของโปรแกรมในสายตาของฉัน - การเรียกวิธีการพื้นฐาน - แต่นั่นเป็นอีกเรื่องหนึ่ง Java ไม่สนับสนุนไวยากรณ์นั้นอย่างไรก็ตามมันเป็นเรื่องของการตั้งค่าและการฝึกอบรมสายตา
Ignis

10
SetVisible()ไม่แนะนำให้ฉันแสดงว่าคุณกำลังแสดงอะไรจริงๆ มันอ่านมากขึ้นเช่นคุณกำลังตั้งค่าคุณสมบัติการมองเห็นของวัตถุอาจปล่อยให้มันเป็นวิธีการที่สอดคล้องกันRefresh()หรือRedisplay()วิธีการตรวจสอบค่าของคุณสมบัตินี้เพื่อตรวจสอบว่าวัตถุควรจะแสดงหรือซ่อน
TMN

1
น่าเสียดายที่ Java ไม่รองรับคุณสมบัติเช่น C # แต่มีเฉพาะ getters และ setters ที่คุณเห็นด้านบน
theGreenCabbage

1
@TMN: ฉันคาดว่าในกรณีที่ไม่มีปัจจัยอื่น ๆ ที่ป้องกันการมองเห็น (ลำดับ Z, การแสดงผลหลัก, ตำแหน่ง, ฯลฯ ) setVisible(true)จะตั้งค่าเป็นกระบวนการที่วัตถุจะถูกวาดเมื่อระบบไม่ได้ใช้งานต่อไปถ้าไม่ก่อน ฉันคาดหวังว่าrefreshอาจมีประโยชน์ในการเร่งการแสดงวัตถุ แต่ในที่สุดวัตถุก็จะถูกดึงออกมาโดยไม่คำนึงถึง (เว้นแต่ว่าทัศนวิสัยนั้นถูกตั้งค่าไว้falseก่อนเกิดเหตุการณ์)
supercat

35

ฉันไม่เห็นด้วยกับผู้โพสต์ทั้งหมดที่แนะนำให้ใช้หลายฟังก์ชั่นในการทำสิ่งเดียวกันเป็นสิ่งที่ดี ขณะที่สามหน้าที่แทนหนึ่งไม่อาจดูเหมือนบวมมากจำไว้ว่าการเรียนของคุณมีโอกาสที่จะจบลงด้วยฟังก์ชั่นดังกล่าวจำนวนมาก (เช่นsetEnabled, enable, disable) และทำให้วิธีการนี้จะจบลงด้วยมากอินเตอร์เฟซชั้นขนาดใหญ่ นอกจากนี้อาจเป็นไปได้ว่าคุณจะพบกับฟังก์ชั่น / คุณสมบัติ / สิ่งที่คล้ายกันในคลาสของคุณและการเพิ่มจำนวนฟังก์ชั่นจะทำให้คุณไม่เข้าใจ

ในภาษาที่รองรับคุณสมบัติเหล่านี้ควรเป็นที่ต้องการ แต่เนื่องจากทั้ง Java และ C ++ ไม่ทำฉันจึงเดาว่าเป็นจุดที่สงสัย

ฉันคิดว่าsetVisible()ควรเป็นเพราะเหตุผลเหล่านี้:

  1. มันชัดเจนทันทีว่าฟังก์ชันผกผันคืออะไร ที่จะย้อนกลับsetVisible(false)ที่คุณเรียกsetVisible(true)ในขณะที่ตรงข้ามของได้อย่างง่ายดายhide()reveal()
  2. มันง่ายกว่าโดยทางโปรแกรมเมื่อใดก็ตามที่คุณกำหนดสถานะที่ควรใช้ในโค้ดเช่นคุณสามารถโทรหาได้setVisible(wantToSee)มากกว่าการใช้ifคำสั่ง
  3. เมื่อคุณมีฟังก์ชั่นที่คล้ายกันหลายsetX()รูปแบบ generalises รูปแบบเพื่อให้คุณสามารถมีชุดของฟังก์ชั่นที่สอดคล้องกันในขณะที่วิธีการ verbed spawns โฮสต์ของฟังก์ชั่นที่อาจเป็นเรื่องยากที่จะค้นหาถ้าคุณไม่รู้ว่าคุณกำลังมองหา ความสอดคล้องใน API ทำให้ง่ายต่อการเรียนรู้และจดจำ

3
C ++ ไม่มีคุณสมบัติ แต่มันมีฟังก์ชั่นที่ว่างดังนั้นคุณสามารถขยายคลาสอินเตอร์เฟสโดยไม่ต้องเพิ่มฟังก์ชั่นสมาชิกใหม่เช่นการมีเพศสัมพันธ์ในระดับที่ต่ำกว่า
phresnel

บ่อยครั้งที่ Qt มอบความสะดวกสบายทั้งสามอย่างเพื่อให้ hide () และ show () สามารถเชื่อมต่อโดยตรงกับกิจกรรมอื่น ๆ โดยใช้ระบบสัญญาณ / สล็อต นี่เป็นข้อ จำกัด ของระบบสล็อตแม้ว่า - หากใช้บางอย่างเช่นฟังก์ชันเพิ่ม :: :: อาร์กิวเมนต์จริง / เท็จอาจถูกผูกไว้ที่จุดตั้งค่าการโทรกลับ

1
"ในภาษาที่รองรับคุณสมบัติเหล่านี้ควรเป็นที่ต้องการ แต่เนื่องจากทั้ง Java และ C ++ ไม่ทำฉันจึงเดาว่าเป็นจุดที่สงสัย" ไม่จำเป็น. ในการตั้งค่าเพื่อ getters / setters? ใช่. แต่ set_visible ไม่ใช่ setter จริง ๆ
Miles Rout

19

ขึ้นอยู่กับสิ่งที่แสดงและซ่อนความหมายในบริบท ก่อนอื่นคุณต้องหาว่าอันไหนเป็น "วิธีหลัก" ของคุณและมุ่งเน้นไปที่การพัฒนา:

  • เหตุผลในการเลือก setVisible(bool)
    • มันเป็นเพียงการพลิกบิตหรือวัตถุของคุณส่วนใหญ่จะเป็นสถานะ
    • วัตถุของคุณจะใช้เวลาส่วนใหญ่ในกรอบการทำงานของ CRUD
    • มีรหัสที่แชร์ได้อย่างง่ายดายจำนวนมากระหว่างการแสดงและการซ่อน
  • เหตุผลในการเลือกshow()และhide()
    • มีผลข้างเคียงที่สำคัญหรือลอจิกจำนวนมากที่ถูกเรียกใช้เช่นเมื่อวัตถุต้องตรวจสอบคอนเทนเนอร์ทั้งหมดสำหรับสถานะการมองเห็นของพวกเขาหรือทริกเกอร์ภาพเคลื่อนไหวการเปลี่ยนแปลง
    • มันเป็นส่วนหนึ่งของรูปแบบโดเมนที่แสดงความตั้งใจเป็นสิ่งสำคัญ

ตกลงดังนั้นตอนนี้คุณได้เขียนรหัส "มาตรฐานทองคำ" ของมันแล้วคุณต้องคิดออกว่ามันคุ้มค่าที่จะเพิ่มวิธีการอำนวยความสะดวกแบบอื่นในรูปแบบอื่น ๆ หรือไม่เพื่อให้ชีวิตของใครก็ตามง่ายขึ้น

  • ความสะดวกสบายของ setVisible(bool)
    • ให้คุณหลีกเลี่ยงคำสั่ง if ที่มีเงื่อนไขเล็กน้อยและมีผลต่อการมองเห็น (เช่นsetVisible(a==b))
    • สามารถเชื่อมต่อเข้ากับเฟรมเวิร์กของ getter / setter ได้หากนั่นเป็นสิ่งที่คุณคาดหวังไว้
  • ความสะดวกสบายของshow()และhide()
    • มีประโยชน์ในภาษาที่มีฟังก์ชั่นชั้นหนึ่งและการโทรกลับ (เช่นonSuccess(widget.show))
    • อ่านง่ายขึ้นด้วยการติดตามสแต็กและการทำโปรไฟล์ประสิทธิภาพเนื่องจากคุณสามารถดูได้อย่างรวดเร็วว่าโปรแกรมพยายามทำอะไร

TLDR:ค้นหาว่าอันไหนสำคัญที่สุดนำไปใช้แล้วถามตัวเองว่ามันคุ้มค่าที่จะเพิ่มสไตล์อื่น ๆ เป็นวิธีการอำนวยความสะดวกแบบบาง ๆ หรือไม่


11

ฉันจะพูดว่า "ทั้งสาม"

Show()และHide()มีแนวโน้มที่จะง่ายต่อการ grok กว่าและSetVisible(true) SetVisible(false)แต่เมื่อคุณต้องการที่จะตั้งค่าการแสดงเหตุผลมันจะดีกว่าที่จะมีวิธีการที่boolมากกว่าการสร้างรอบที่ifbool

คุณสามารถรองรับทั้งสามได้โดยไม่ต้องทำซ้ำลอจิกและโครงสร้างที่เล็กที่สุด:

void Show() {
    foo.Show();
    bar.Show();
}

void Hide() {
    foo.Hide();
    bar.Hide();
}

void SetVisible(bool visible) {
    if (visible) {
        Show();
    } else {
        Hide();
    }
}

อีกทางหนึ่งถ้าสิ่งที่คุณกำลังห่อมีSetVisibleAPI ที่มีค่ามากกว่า:

void Show() {
    SetVisible(true);
}

void Hide() {
    SetVisible(false);
}

void SetVisible(bool visible) {
    foo.SetVisible(visible);
    bar.SetVisible(visible);
}

40
System.Windows.Forms.Timerไมโครซอฟท์ใช้วิธีนี้สำหรับการเริ่มต้นและหยุด โดยส่วนตัวแล้วฉันคิดว่านี่น่าสับสน เมื่อฉันเห็นทั้งสองShowและSetVisibleความโน้มเอียงแรกของฉันคือการสงสัยว่ามีความแตกต่างที่สำคัญระหว่างสองฟังก์ชั่นหรือไม่
Brian

1
คุณสามารถจัดทำเอกสารเพื่อกำจัดความสับสนนั้นได้อย่างง่ายดาย ฉันไม่ได้เป็นเช่นนี้เป็นตัวอย่างง่ายๆ
Garry Shutler

20
ดังนั้นตอนนี้ฉันต้องใช้เวลา X นาทีพิเศษในการอ่านเอกสารก่อนที่ฉันจะรู้สึกสะดวกสบายเมื่อใช้คลาส? หรืออีกทางหนึ่งฉันต้องเสียเวลาเพิ่มอีกสิบนาทีในการสับสน (หรือการแนะนำบั๊ก)? แน่นอนว่า X ค่อนข้างเล็กสำหรับสิ่งนี้ แต่มันไม่ได้เป็นศูนย์แน่นอน การเสนอตัวเลือกทั้งหมด 3 ตัวหมายถึงการเสนอฟังก์ชั่นให้มากที่สุดเท่าที่จำเป็นสามครั้งซึ่งหมายความว่าคุณต้องใช้เอกสารมากขึ้นในการทำงานและฉันใช้เวลามากขึ้นในการเรียนรู้วิธีใช้ห้องเรียน นอกจากนี้ยังแนะนำวิธีการอีกวิธีหนึ่งให้ผู้พัฒนาที่แตกต่างกันจะไม่สอดคล้องกันเมื่อใช้คลาสของคุณ
Brian

5
นี่เป็นการละเมิดหลักการแยกส่วนต่อประสานที่ชัดเจนซึ่งเป็นหนึ่งในหลักการ SOLID ความเห็นอีกข้อหนึ่งเกี่ยวกับแนวทางของคุณมันมาจาก jaroslav tulach ผู้ออกแบบ netbeans ที่ยืนยันหลายครั้งในการให้วิธีเดียวเท่านั้นในการทำสิ่งหนึ่งภายใน API ในการออกแบบ API ที่ใช้งานได้จริงในหนังสือของเขา
AlfredoCasado

@AlfredoCasado ฉันเห็นด้วย เกิดอะไรขึ้นถ้า setVisible ได้รับการคุ้มครองแต่? คุณสามารถเข้าถึงได้จากคลาสย่อย แต่การเรียกไปยังเอนทิตีที่กำหนดด้วยอินเทอร์เฟซนี้ (เช่น API) จะต้องเป็นซ่อน / แสดง
Pierre Arlaud

5

ฉันชอบ show () และ hide () ที่จริงแล้วทุกวิธีที่ได้รับบูลีนหนึ่งสามารถเปลี่ยนได้สำหรับสองวิธีที่แสดงความตั้งใจของ API ได้ดีขึ้น ตัวอย่างเช่น Robert Martin ในโค้ดที่สะอาดแนะนำให้เลือกเมธอดที่มีอาร์กิวเมนต์เป็นศูนย์เหนือเมธอดที่มีหนึ่งอาร์กิวเมนต์

อีกเหตุผลที่สำคัญสำหรับฉันคือการอ่านในความคิดของฉันรหัสที่ดีสามารถอ่านได้เช่นร้อยแก้วมันเป็นร้อยแก้วที่แปลกจริง ๆ บางอย่างเช่น "main_window setVisible false" แทนที่จะเป็น "main_window ซ่อน" คุณเขียนหรือพูดอย่างนั้นทำไม? การสร้างภาษาในโปรแกรมซอฟต์แวร์เมื่อเป็นไปได้อย่างสมบูรณ์ใช้ภาษาที่เป็นธรรมชาติมากขึ้น?


1
Assembler ประกอบร้อยแก้วไม่เพียงพอหรือไม่
Alexander

ฉันคาดหวังว่าลำดับit.setVisible(false); it.setVisible(true);ไม่ควรส่งผลกระทบต่อการมองเห็นของผู้ปกครองและไม่ควรส่งผลกระทบต่อลำดับ Z หรือตำแหน่งของตัวควบคุม ในทางตรงกันข้ามhide(); show(); อาจบังคับให้ผู้ปกครองของตัวควบคุมปรากฏให้เห็นได้อย่างน่าเชื่อถือย้ายไปไว้เหนือตัวควบคุมอื่น ๆ และ จำกัด ตำแหน่งไว้ที่ใดที่สามารถมองเห็นได้ ในบางกรณีก็มีประโยชน์ที่จะมีวิธีการทำให้แน่ใจว่าสิ่งที่จะมองเห็นได้จริง (เช่นเดียวกับที่กล่าวไว้show()แต่ในกรณีอื่น ๆ ก็มีประโยชน์ที่จะเปลี่ยนธงมองเห็นได้โดยไม่ต้องเปลี่ยนอะไรอื่น.
SuperCat

ใน Object Oriented API ไม่มี "flag" OO เป็นเรื่องเกี่ยวกับการส่งข้อความมันเกี่ยวกับบอกวัตถุอื่นทำงานบางอย่างไม่เกี่ยวกับการเปลี่ยน "ธง" ที่เป็นสถานะของวัตถุ คุณกำลังตั้งสมมติฐานจำนวนมากเกี่ยวกับการควบคุมผู้ปกครองการสั่งซื้อ z และสิ่งที่คุณคาดหวังจากประสบการณ์ที่ผ่านมาของคุณกับ API อื่น ๆ มันเป็นความคิดที่แย่มาก ๆ ในการออกแบบ API ตามความรู้สึกส่วนตัวและสมมติฐานเกี่ยวกับโดเมน
AlfredoCasado

5

ฉันเชื่อว่ายิ่งวิธีมีความชัดเจนมากเท่าไรก็ยิ่งสามารถอ่านได้มากขึ้นเท่านั้นดังนั้นรหัสที่สามารถบำรุงรักษาได้ พิจารณาสองกรณีต่อไปนี้:

กรณีที่ 1:

void showCustomerData(customerId){
  Customer customer = getCustomer(CustomerId);
  customerPanel.setVisible(customer.isCustomerEnabled());
}

กรณีที่ 2:

void showCustomerData(customerId){
  Customer customer = getCustomer(CustomerId);
  //always show customer panel
  customerPanel.setVisible(true);
}

ในกรณีแรกมันชัดเจนว่าฟังก์ชั่น "setVisible" กำลังทำอะไร แต่ถ้าคุณต้องการอ่านคุณจะพูดว่า:

ตั้งค่าพาเนลลูกค้าให้มองเห็นได้หากลูกค้าเปิดใช้งานหรือตั้งเป็นซ่อนหากลูกค้าปิดใช้งาน

ในขณะที่มันเป็นคำอธิบายเพิ่มเติมที่จะพูดว่า:

  • ตรวจสอบสถานะของลูกค้า:
    • หากลูกค้าถูกเปิดใช้งานให้แสดงพาเนลของลูกค้า
    • มิฉะนั้นซ่อนไว้

ซึ่งจะเปลี่ยนฟังก์ชัน "Case 1" เป็นดังต่อไปนี้:

void showCustomerData(customerId){
  Customer customer = getCustomer(CustomerId);
  if(customer.isCustomerEnabled()){
    customerPanel.Show();
  }
  else{
    customerPanel.Hide();
  }
}

มันสร้างรหัสเพิ่มเติม แต่สามารถอ่านได้มากขึ้น

กรณีที่สองมีข้อบกพร่องที่เห็นได้ชัดคือคุณรู้อยู่แล้วว่าคุณต้องการแสดงพาเนลดังนั้นทำไมไม่ใช้ฟังก์ชั่น "แสดง"

ฉันไม่ได้บอกว่าการใช้ "setVisible" ผิดอย่างแน่นอน แต่มันก็เกิดความสับสนเมื่อคุณพยายามอ่านโค้ดที่คุณไม่ได้เขียนเมื่อเวลาผ่านไปและมันไม่สอดคล้องกับกฎ "A function ควรดำเนินการเพียงครั้งเดียว"


ฉันจะบอกว่า: show customer panel iff the user/customer is enabled. ฉันยอมรับว่าอาจมีเงื่อนไขที่ซับซ้อนมากขึ้นไม่ใช่เรื่องง่ายที่จะอ่านตามตัวอย่างของคุณอย่างไรก็ตามในกรณีเหล่านั้นฉันจะแบ่งเงื่อนไขเหล่านั้นออกเป็นบรรทัดต่าง ๆ
ComFreek

5

ฉันเชื่อว่าHide()/ Show()ทางเลือกนั้นน่าสนใจเพราะมันง่ายกว่าที่จะเข้าใจว่าเกิดอะไรขึ้นกับSetVisible(true)ในขณะที่มีฟังก์ชั่นเดียวจะดีกว่าเพราะหลีกเลี่ยงเงื่อนไขมากมาย

หากเป็นกรณีที่แล้วผมขอแนะนำให้ใช้นับเป็น input เพื่อSetVisibleให้คุณได้รับอย่างใดอย่างหนึ่งหรือSetVisible(Visibility.Visible) SetVisible(Visibility.Hidden)คุณมีฟังก์ชั่นเดียวคุณสามารถอ่านสิ่งที่กำลังดำเนินการได้ทันที

โดยใช้ Java ของการตั้งชื่อที่คุณจะต้องอาจจะหรือsetVisible(Visibility.VISIBLE)setVisible(Visibility.HIDDEN)


3

ฉันเห็นด้วยกับคำตอบของ Darien แต่ต้องการเพิ่มมุมมองจากมุมมองของโปรแกรมเมอร์ C #

เมื่อฉันเห็นโค้ดที่ระบุว่า 'setXXX' ฉันอ่านแล้วว่ามันเป็นการตั้งค่าสิ่งหนึ่งฉันไม่คาดหวังว่าสิ่งนี้จะมีผลข้างเคียงในสิ่งอื่นนอกเหนือจากการตั้งค่านั้นและฉันคาดหวังว่านี่จะเป็น idempotent (เช่นฉันสามารถตั้งค่าด้วยค่าเดียวกันและมันก็โอเค) มันค่อนข้างเหมือนกับการเข้าถึงเขตข้อมูล โดยทั่วไปฉันคาดหวังว่าจะเห็นวิธี 'getXXX' พร้อมกับ 'setXXX'

ฉันไม่รู้ว่านี่คือสิ่งที่คุณคาดหวังใน Java และ C ++ หรือไม่ แต่นั่นคือสิ่งที่ฉันคาดหวังใน C # ถึงแม้ว่าใน C # จะมีมือสั้น ๆ สำหรับคุณสมบัตินี้เรียกว่า และนี่คือคำแนะนำที่ดีเกี่ยวกับวิธีใช้คุณสมบัติ ( http://msdn.microsoft.com/en-us/library/ms182181.aspx )

เมื่อพิจารณาจากมุมมองนี้แล้วอินเทอร์เฟซที่ฉันเลือกนั้นขึ้นอยู่กับว่ามีผลข้างเคียงใด ๆ (นอกเหนือจากการเปลี่ยนค่าของฟิลด์นั้น):

หากการดำเนินการมีผลข้างเคียงเช่นกำลังแสดงกล่องโต้ตอบฉันจะไปกับ "แสดง ()" และ "ซ่อน ()"

หากไม่มีผลข้างเคียงบอกว่าฉันตั้งค่าการมองเห็นของ "เครื่องมือ" และสิ่งอื่นแสดงเครื่องมือที่ขึ้นอยู่กับสถานะของมันแล้วฉันจะใช้ setVisibility หรือ setIsVisible (ฉันจะไม่เรียกมันว่า SetVisible)

ใน C # (ไม่แน่ใจเกี่ยวกับ Java) เป็นเรื่องธรรมดาที่จะนำรูปแบบการสังเกตการณ์มาใช้ซึ่งเฟรมเวิร์ก UI จะรับฟังการเปลี่ยนแปลงกับวัตถุและจะแสดงผล UI โดยอัตโนมัติอีกครั้งเมื่อคุณสมบัติเช่นการมองเห็นเปลี่ยนแปลง นั่นหมายความว่าการตั้งค่าโดยการเรียก setIsVisible ปรากฏขึ้นราวกับว่ามันมีผลข้างเคียง แต่ในความหมายของฉันมันไม่ได้ สัญญาของวิดเจ็ตเป็นจริงโดยการตั้งค่าเป็นค่าฟิลด์ที่แสดงถึง "IsVisible"

อีกวิธีหนึ่งก็คือฉันสามารถสลับการแสดงฉลากบนแบบฟอร์มก่อนที่จะแสดงแบบฟอร์ม Ie label.getIsVisible == จริง แต่แบบฟอร์มไม่ปรากฏขึ้น

ฉันไม่ได้โทร Hide () เมื่อไม่ได้แสดงแบบฟอร์ม


1
คำอธิบายgetXXX()และsetXXX()วิธีการของคุณเป็นวิธีการเข้าถึงฟิลด์ที่ไม่มีผลข้างเคียงเสียงเช่น Java และไม่ใช่ C # นี่คือวิธีที่คุณต้องทำใน Java เพราะมันไม่มีคุณสมบัติ ถ้าฉันเห็นโค้ดแบบนั้นใน C # ฉันจะเดาว่ามันเขียนโดยนักพัฒนา Java ที่ยังไม่ได้เรียนรู้เกี่ยวกับคุณสมบัติใน C #
gilly3

+1 SetVisibilityสำหรับ
akaltar

@ gilly3 - ใช่แน่นอน และ "คุณสมบัติ" ไม่มีอยู่ใน CLR, C # แปลเป็นวิธีการเรียกใช้ get_XXX และ set_YYY ใน IL ประเด็นของฉันคือ: ในบริบทของคำถามหากคุณเห็น setXXX, getXXX ใน Java คุณคาดหวังว่ามันจะทำงานกับซีแมนทิกส์เดียวกับคุณสมบัติใน C # สิ่งนั้นเป็นจริงฉันจึงให้เหตุผลว่าแนวทางเดียวกันสำหรับคุณสมบัติใน C # สามารถใช้ได้กับคู่ของ setXXX และ getXXX ใน Java ฉันเห็นด้วยกับแนวทางที่ฉันอ้างอิงในโพสต์ดังนั้นฉันจึงสนับสนุนแนวทางเดียวกันนี้สำหรับใช้ในสถานการณ์นี้ใน Java เมื่อกำหนดอินเทอร์เฟซ
Daniel James Bryars

1
อาจช่วยให้ชัดเจนว่าเมื่อคุณหมายถึง "ผลข้างเคียง" คุณหมายถึง "นอกเหนือจากที่เกี่ยวข้องกับการเป็น 'สิ่งที่สังเกตได้' กฎที่ฉันโปรดปรานคือการพูดว่าหากการgetXXโทรมีsetXXวิธีการที่สอดคล้องกันนั้นsetYYจะไม่ส่งผลกระทบต่อมัน แต่มันอาจส่งผลกระทบต่อการgetZZโทรที่ไม่มีsetZZวิธีการ
supercat

2

ฉันขอแนะนำอินเทอร์เฟซที่ปรับเปลี่ยนเล็กน้อย:

Show();
Hide();
ToggleVisible();
ToggleVisible(bool visible);

ชื่อที่ดีขึ้น

ชื่อเมธอดเหล่านี้ช่วยให้นักพัฒนาซอฟต์แวร์ตัดสินใจว่าจะใช้วิธีใดโดยอิงตามสิ่งที่ต้องทำ ในขณะที่SetVisible(bool visible)สามารถสร้างความสับสนให้นักพัฒนาเพราะมันบ่งบอกถึงความหมายเช่นเดียวกับShow()และHide(), Toggle()หมายถึงการดำรงอยู่ของเงื่อนไขที่กำหนดดำเนินการ มันจะกลายเป็นเรื่องง่ายสำหรับนักพัฒนาเมื่อใช้แต่ละวิธี

รหัสซ้ำซ้อนลดลง

ประโยชน์ที่จะมีหลายวิธีในอินเทอร์เฟซของคุณก็คือทำให้รหัสการโทรง่ายขึ้น คุณสามารถเปิดเผยShow()และHide()แต่:

  • คุณอาจต้องใช้SetVisible()วิธีการส่วนตัวเพื่อทำงานจริงเบื้องหลัง (หรือเขียนรหัสซ้ำซ้อนสำหรับShow()และHide())
  • รหัสการโทรอาจมีหลายอย่างซ้ำซ้อนหาก / บล็อกเพียงเพื่อเลือกวิธีการที่จะใช้ Bloats นี้รหัสในความคิดของฉัน
  • ถ้าฉันเป็นผู้บริโภคฉันน่าจะเขียนฟังก์ชั่น wrapper ของตัวเองที่ทำในสิ่งที่SetVisible()(หรือToggle()) ทำไปแล้วเพื่อหลีกเลี่ยงการขยายตัวของรหัส (ฉันเกลียดรหัสซ้ำซ้อน) ดังนั้นการทำซ้ำวิธีที่อาจมีอยู่แล้วเป็นวิธีส่วนตัวในการใช้งาน

1
วิธีการทำสำเนาฟังดูสมเหตุสมผลแม้ว่าฉันจะไม่ทำเอง ในทางกลับกันฉันไม่ยอมรับว่า toggleVisible (bool) นั้นใช้งานง่าย สำหรับฉันมันหมายความว่ามันควรจะสลับถ้าผ่านในบูลเป็นความจริงซึ่งจะค่อนข้างแปลก แต่ฉันเห็นคนแปลกหน้า มันจะไม่คิดว่ามันเป็นฟังก์ชั่นชุดปลอมตัว
Patrick M

0

ฉันขอแนะนำให้ใช้SetVisible(bool)หากมีเพียงแค่การสลับการแสดงผลสองครั้ง (แสดงและซ่อนอีกครั้งหรือซ่อนและแสดงอีกครั้ง) จะปล่อยให้สิ่งต่าง ๆ อยู่ในสภาพเป็นหลักเช่นเดียวกับก่อนที่การดำเนินการจะเสร็จสิ้น บางสิ่งบางอย่างหรือในทางกลับกันออกจากวัตถุที่ต้องการวาดใหม่โดยมีเงื่อนไขว่าสามารถเกิดขึ้นได้ "อัตโนมัติ") หากหลบซ่อนตัวและแสดงวัตถุจะไม่มีผลกระทบอื่น ๆ SetVisibleกว่าการเปลี่ยนหนึ่งบิตของรัฐแล้วมันจะทำให้รู้สึกถึงรหัสนอกจะมีวิธีการบางอย่างที่รับพารามิเตอร์การมองเห็นและการเขียนรหัสดังกล่าวจะได้รับการอำนวยความสะดวกโดย

หากการซ่อนและการแสดงวัตถุอีกครั้งอาจมีผลข้างเคียงเช่นการเปลี่ยนลำดับ Z การกระทำดังกล่าวควรกระทำโดยวิธีแยกต่างหาก ในกรณีเช่นนี้ประโยชน์ของวิธีการภายนอกที่ยอมรับพารามิเตอร์ "การมองเห็น" จะถูก จำกัด และดังนั้นจะมีข้อได้เปรียบเล็กน้อยในการอำนวยความสะดวก นอกจากนี้SetVisibleวิธีการ (ผิดพลาด) ชี้ให้เห็นว่าการเปลี่ยนแปลงการมองเห็นวัตถุสามารถทำได้โดยไม่มีผลข้างเคียง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.