มันจะดีกว่าถ้าจะเรียกฟังก์ชั่นที่ไม่มีผลกระทบ ณ จุดนั้นถ้ามันปรับปรุงความชัดเจนของโค้ด?


60

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

ที่ฉันสามารถทำได้

[view1 setAlpha:0.0f];
[view2 setAlpha:0.0f];

สำหรับมุมมองสองมุมมอง แต่ตอนนี้มุมมองที่สาม (มุมมองที่ควรมองเห็นเมื่อเริ่มต้นแอพ) ไม่ได้ถูกระบุ ฉันใส่

[view3 setAlpha:1.0f];

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

หากการโทรนั้นหนักมากมันจะดีกว่าที่จะไม่โทรเมื่อมันไม่จำเป็น แต่ฉันสงสัยเกี่ยวกับสิ่งเล็ก ๆ น้อย ๆ เช่นแบบของฉัน

คำตอบ:


134

คุณมีค่าคงที่:

มีเพียงมุมมองเดียว (จาก 3) ที่ใช้งานอยู่ (และมองเห็นได้)

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

[setActiveView viewID:2]

ฟังก์ชั่นนี้จะ:

  • ตรวจสอบว่ามุมมองแอ็คทีฟอยู่หรือไม่หลีกเลี่ยงงานที่ไม่จำเป็น
  • ตั้งค่ามุมมองเป็นใช้งานอยู่และมองเห็นได้
  • ตั้งค่ามุมมองอีก 2 มุมมองเป็นไม่ใช้งานและมองไม่เห็น

มันมีข้อดีหลายประการเกี่ยวกับการโทรไปที่setVisibility:

  • ที่เป็นมิตร: การเรียกมันโดยไม่จำเป็นไม่ได้สร้างปัญหาเรื่องประสิทธิภาพ
  • การป้องกัน: พารามิเตอร์เดียวนั้นยากต่อการ botch มากในขณะที่setVisibilityมันยากที่จะจำได้ว่าช่วงของค่าคือ0.0f - 1.0fและที่จะต้องตั้งค่าเดียวเท่านั้น1.0f
  • ยืดหยุ่น: ผู้ชายคนต่อไปไม่สามารถลืมมุมมองหนึ่งโดยไม่ตั้งใจ
  • ที่ปรับได้: การเพิ่ม / ลบมุมมองไม่จำเป็นต้องตรวจสอบรหัสแอปพลิเคชันทั้งหมดเพื่อค้นหาว่าสวิตช์อยู่ที่ไหนฟังก์ชันเดียว (อันนี้) จำเป็นต้องได้รับการอัพเดต

เป็นการดีที่จะช่วยในการบังคับใช้ค่าคงที่ไม่มีฟังก์ชั่นอื่น ๆ ที่สามารถรบกวนการตั้งค่านี้ ...


ข้อเสนอแนะที่ดี ฉันจะทำเช่นนี้กับตัวอย่างปัจจุบันของฉัน แต่เมื่อไรที่การออกแบบนั้นเป็นไปไม่ได้ / ต้องการ? หรือคุณตัดสินใจทันทีว่าวิธีที่ดีที่สุดในการจัดการกับมันคืออะไร?
เควิน

4
@ เควิน: มันขึ้นอยู่กับมันจริงๆ บางครั้งคุณสามารถแก้ปัญหาได้ด้วยการวนซ้ำชุดสะสม แต่บางครั้งก็ไม่ใช่ แต่หลักการสำคัญคือหลีกเลี่ยงการทำซ้ำและเพื่อให้ง่ายต่อการรักษาค่าคงที่ จำเป็นต้องจดจำการกระทำที่ "ทำเอง" ให้มากขึ้นเพื่อให้สิ่งต่าง ๆ ทำงานได้อย่างถูกต้องโอกาสที่คุณมีสิ่งต่างๆน้อยลงจะทำงานได้อย่างถูกต้อง ฉันเกลียดที่จะคลุมเครือที่นี่ แต่มีสถานการณ์ต่าง ๆ มากมายที่ฉันกลัวว่ากฎ "ทั่วไป" จะทำให้คุณหลงทาง
Matthieu M.

23
"ทำให้ง่ายต่อการรักษาค่าคงที่"เป็นกฎทั่วไปที่ควรค่าแก่การจดจำ
Gusdor

1
@Tonny: ฉันไม่รู้ว่าการกระตุ้นให้เกิดการใช้ตัวแปรโกลบอลคือ "ทำถูกต้อง" แต่ถ้าคุณรู้แน่ชัดว่าเคยใช้งานมาก่อนคุณต้องการอัพเดตสองมุมมองเท่านั้น อีกวิธีหนึ่งคือให้แต่ละมุมมองจดจำการมองเห็นและsetVisibilityไม่ต้องทำอะไรเลยหากการมองเห็นเป็นสิ่งที่ร้องขอมาแล้วซึ่งจะลดความรับผิดชอบลง
Matthieu M.

1
@MatthieuM ฉันรีบเขียน แต่จริงๆแล้วฉันหมายถึงเหมือนกัน หากคุณทราบสถานะก่อนหน้านี้คุณจะต้องอัปเดต 2 ครั้งมากที่สุดเท่านั้น วิธีการจำสถานะนั้นเป็นอีกเรื่อง ;-) สำหรับการย้ายความรับผิดชอบลง: ถ้ามุมมองคลาสไม่ได้จัดเตรียมไว้ให้คุณจะต้องล้อมคลาสในวัตถุอื่นเพื่อเพิ่มคุณสมบัตินั้น นั่นเป็นวิธีแก้ปัญหาที่สะอาด แต่อาจเป็นเรื่องที่เกินความจริงเล็กน้อย
Tonny

12

แนวคิดอื่น: หากเป้าหมายของคุณคือการป้องกันข้อผิดพลาดที่เกิดขึ้นเพราะคนลืมว่ามีสามมุมมองและทำบางสิ่งกับพวกเขาเพียงสองคนเท่านั้นที่พวกเขาควรทำกับพวกเขาทั้งหมดจากนั้นสร้างฟังก์ชันที่ทำให้เป็นไปไม่ได้ที่จะลืม

setViewVisibilities(0.0f, 0.0f, 1.0f)

ตอนนี้คุณมีบางสิ่งบางอย่างมีประสิทธิภาพมากขึ้น - รวบรวมเวลารับประกันคุณยังไม่ลืม หากคุณลืมพารามิเตอร์คอมไพเลอร์จะตะโกนใส่คุณ สิ่งนี้มีประโยชน์มากกว่าความคิดเห็นหรือรหัสที่ไม่จำเป็นเนื่องจากจะสร้างโปรโตคอลที่มีชื่อที่เข้มงวดซึ่งบังคับใช้คุณสมบัติที่คุณสนใจ

สำหรับกรณีที่view3ไม่จำเป็นก็มองเห็นการเปลี่ยนแปลงคุณสามารถเพิ่มพฤติกรรมบางอย่างที่ผ่านค่าพิเศษเช่น-1.0หรือnilหรือสิ่งที่ตามเส้นที่หมายความว่า "ไม่เปลี่ยนการมองเห็นมุมมองที่ทุกคน" สิ่งนี้ทำให้เกิดปัญหาในการตั้งค่าการมองเห็นโดยไม่จำเป็น


9
หาก OP ได้รับการดูมากถึง 10+ การดูพารามิเตอร์ต่อการดูจะไม่สามารถทำได้ จุดของคุณเกี่ยวกับข้อผิดพลาดในการคอมไพล์เวลานั้นถูกต้อง แต่นี่เป็นวิธีแก้ปัญหาที่ไม่สามารถแก้ไขได้อย่างน่าเสียดาย
Chris Cirefice

3
@ChrisCirefice: หากจำนวนการดูเพิ่มขึ้นคุณสามารถสร้างวัตถุ / คลาส "ViewState" บางประเภทซึ่งบังคับค่าคงที่นี้ จากนั้นใช้สิ่งนั้นสำหรับการสลับเป็นต้นด้วยมุมมองจำนวนมากวัตถุผู้จัดการบางประเภทอาจเหมาะสม
sleske

8

ฉันเชื่อว่าการเพิ่มความคิดเห็นอธิบายว่าการโทรนั้นไม่จำเป็น (และสาเหตุ) ดีที่สุด

(บางทีความจริงที่ว่าการโทรนั้นไม่จำเป็นหรือคุณต้องการความคิดเห็นเกี่ยวกับสิ่งนั้นอาจเป็นกลิ่นรหัส)


1
@Niall หากเป็นไปได้การยืนยันจะดีกว่าความคิดเห็น
200_success

9
ความคิดเห็นไม่ใช่วิธีแก้รหัสที่ไม่สามารถอ่านได้และไม่สามารถอ่านได้
dj18

2
@ เควินหรือคุณสามารถเขียนโค้ดที่อ่านได้อย่างสมบูรณ์แบบโดยไม่มีความคิดเห็น
ม.ค.

1
@Jan ความคิดเห็นที่มากกว่าเพียงแค่อธิบายว่ารหัสไม่ .......
เควิน

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

4

ในกรณีพิเศษนี้ @Mattieu M. มีทางออกที่ถูกต้อง

ในกรณีทั่วไปที่ไม่มีที่คล้ายกันเปลี่ยนคุณต้องถามตัวเอง: มีใด ๆโอกาสเป็นระเบียบโปรแกรมเมอร์อาจอนาคตนี้ได้หรือไม่

คำตอบคือมักจะใช่ ซึ่งหมายความว่าใช่คุณควรเพิ่มการโทร บางทีเฟรมเวิร์กเวอร์ชันในอนาคตบางเวอร์ชันอาจเริ่มต้นด้วยมุมมองทั้งหมดปิดแทนเปิด

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