ข้อยกเว้น vs ชุดผลลัพธ์ว่างเปล่าเมื่ออินพุตมีความถูกต้องทางเทคนิค แต่ไม่น่าพอใจ


108

ฉันกำลังพัฒนาห้องสมุดที่มีไว้สำหรับเผยแพร่สู่สาธารณะ มันมีวิธีการต่าง ๆ สำหรับการทำงานกับชุดของวัตถุ - การสร้างการตรวจสอบการแบ่งและการฉายชุดในรูปแบบใหม่ ในกรณีที่มีความเกี่ยวข้องมันเป็นไลบรารีคลาส C # ที่มีส่วนขยายของสไตล์ LINQ IEnumerableที่จะเปิดตัวเป็นแพ็คเกจ NuGet

วิธีการบางอย่างในไลบรารีนี้สามารถให้พารามิเตอร์อินพุตที่ไม่น่าพอใจ ตัวอย่างเช่นในวิธี combinatoric มีวิธีการสร้างชุดnรายการทั้งหมดที่สามารถสร้างขึ้นจากชุดแหล่งที่มาของรายการm ตัวอย่างเช่นกำหนดชุด:

1, 2, 3, 4, 5

และขอให้รวมกัน 2 จะผลิต:

1, 2
1, 3
1, 4
ฯลฯ ...
5, 3
5, 4

เห็นได้ชัดว่าเป็นไปได้ที่จะขอสิ่งที่ไม่สามารถทำได้เช่นให้ชุด 3 รายการจากนั้นขอชุดค่าผสม 4 รายการพร้อมตั้งค่าตัวเลือกที่ระบุว่าสามารถใช้งานได้เพียงครั้งเดียว

ในสถานการณ์สมมตินี้แต่ละพารามิเตอร์จะถูกต้องเป็นรายบุคคล :

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

อย่างไรก็ตามสถานะของพารามิเตอร์เมื่อนำมารวมกันทำให้เกิดปัญหา

ในสถานการณ์นี้คุณคาดหวังว่าวิธีการจะยกเว้น (เช่น. InvalidOperationException) หรือส่งคืนคอลเลกชันที่ว่างเปล่า? ดูเหมือนว่าจะใช้ได้กับฉัน:

  • คุณไม่สามารถผลิตการรวมกันของnรายการจากชุดของรายการที่n> ม.InvalidOperationExceptionถ้าคุณได้รับอนุญาตเท่านั้นที่จะใช้แต่ละรายการครั้งเดียวดังนั้นการดำเนินการนี้ถือว่าเป็นไปไม่ได้ด้วยเหตุนี้
  • ชุดของการรวมกันของขนาดnที่สามารถสร้างจากรายการmเมื่อn> mเป็นชุดว่าง ไม่สามารถสร้างชุดค่าผสมได้

อาร์กิวเมนต์สำหรับชุดที่ว่างเปล่า

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

var result = someInputSet
    .CombinationsOf(4, CombinationsGenerationMode.Distinct)
    .Select(combo => /* do some operation to a combination */)
    .ToList();

หากชุดอินพุตของคุณมีขนาดผันแปรลักษณะการทำงานของรหัสนี้ไม่แน่นอน หาก.CombinationsOf()มีข้อผิดพลาดเกิดขึ้นเมื่อsomeInputSetมีองค์ประกอบน้อยกว่า 4 ครั้งบางครั้งรหัสนี้จะล้มเหลวขณะทำงานโดยไม่มีการตรวจสอบล่วงหน้า ในตัวอย่างข้างต้นการตรวจสอบนี้เป็นเรื่องเล็กน้อย แต่ถ้าคุณเรียกมันว่าลงมาครึ่งทางของสายโซ่ยาวของ LINQ นี่อาจจะน่าเบื่อ หากมันส่งคืนชุดว่างเปล่าก็resultจะว่างเปล่าซึ่งคุณอาจจะพอใจอย่างสมบูรณ์

อาร์กิวเมนต์สำหรับข้อยกเว้น

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

คุณคาดหวังอะไรและคุณโต้แย้งอะไร


66
เนื่องจากเซตว่างเปล่านั้นถูกต้องทางคณิตศาสตร์มีโอกาสที่เมื่อคุณได้รับมันจริง ๆ แล้วเป็นสิ่งที่คุณต้องการ คำจำกัดความทางคณิตศาสตร์และอนุสัญญามักจะถูกเลือกเพื่อความมั่นคงและความสะดวกสบายเพื่อให้สิ่งต่าง ๆ ได้ผลกับพวกเขา
asmeurer

5
@ ผู้ตรวจสอบพวกเขาถูกเลือกเพื่อให้ทฤษฎีบทมีความสอดคล้องและสะดวกสบาย พวกเขาไม่ได้เลือกที่จะทำให้การเขียนโปรแกรมง่ายขึ้น (นั่นคือประโยชน์บางครั้ง แต่บางครั้งพวกเขาก็ทำให้การเขียนโปรแกรมยากขึ้นเช่นกัน)
jpmc26

7
@ jpmc26 "พวกเขาได้รับเลือกเพื่อให้ทฤษฎีบทมีความสอดคล้องและสะดวกสบาย" - ตรวจสอบให้แน่ใจว่าโปรแกรมของคุณทำงานได้อย่างที่คาดไว้เสมอเทียบเท่ากับการพิสูจน์ทฤษฎีบท
artem

2
@ jpmc26 ฉันไม่เข้าใจว่าทำไมคุณถึงพูดถึงการเขียนโปรแกรมฟังก์ชั่น การพิสูจน์ความถูกต้องสำหรับโปรแกรมที่จำเป็นนั้นเป็นไปได้ค่อนข้างเป็นประโยชน์เสมอและสามารถทำได้อย่างไม่เป็นทางการเช่นกัน - แค่คิดเล็กน้อยและใช้สามัญสำนึกทางคณิตศาสตร์เมื่อคุณเขียนโปรแกรมของคุณและคุณจะใช้เวลาทดสอบน้อยลง พิสูจน์ทางสถิติกับตัวอย่างของหนึ่ง ;-)
Artem

5
@DmitryGrigoryev 1/0 ตามที่ไม่ได้กำหนดมีความถูกต้องทางคณิตศาสตร์มากกว่า 1/0 ว่าไม่มีที่สิ้นสุด
asmeurer

คำตอบ:


145

คืนชุดเปล่า

ฉันคาดหวังชุดที่ว่างเปล่าเพราะ:

มี 0 ชุดของตัวเลข 4 ตัวจากชุด 3 เมื่อฉันสามารถใช้แต่ละหมายเลขได้ครั้งเดียวเท่านั้น


5
ในทางคณิตศาสตร์ใช่ แต่ก็อาจเป็นสาเหตุของความผิดพลาดได้เช่นกัน หากคาดว่าอินพุตประเภทนี้จะเป็นการดีกว่าถ้าผู้ใช้ตรวจจับข้อยกเว้นในไลบรารีวัตถุประสงค์ทั่วไป
Casey Kuball

56
ฉันไม่เห็นด้วยที่เป็นสาเหตุของข้อผิดพลาด ตัวอย่างเช่นสมมติว่าคุณกำลังใช้อัลกอริทึมไร้เดียงสา "matchmaknig" จากชุดอินพุตขนาดใหญ่ คุณอาจขอชุดค่าผสมทั้งหมดของสองรายการค้นหาการจับคู่ "ดีที่สุด" เดี่ยวจากรายการเหล่านั้นจากนั้นลบทั้งสององค์ประกอบแล้วเริ่มใหม่ด้วยชุดใหม่ที่มีขนาดเล็กลง ในที่สุดชุดของคุณจะว่างเปล่าและจะไม่มีคู่เหลือให้พิจารณา: ข้อยกเว้น ณ จุดนี้คือสิ่งกีดขวาง ฉันคิดว่ามีหลายวิธีที่จะจบลงในสถานการณ์ที่คล้ายกัน
amalloy

11
จริงๆแล้วคุณไม่ทราบว่านี่เป็นข้อผิดพลาดในสายตาของผู้ใช้หรือไม่ ชุดที่ว่างเปล่าเป็นสิ่งที่ผู้ใช้ควรตรวจสอบหากจำเป็น if (result.Any ()) DoSomething (result.First ()); อื่น DoSomethingElse (); ดีกว่าลอง {result.first (). dosomething ();} catch {DoSomethingElse ();}
Guran

4
@TripeHound นั่นคือสิ่งที่ทำให้การตัดสินใจในตอนท้าย: ต้องการให้นักพัฒนาใช้วิธีนี้เพื่อตรวจสอบแล้วโยนมีผลกระทบน้อยกว่าการทิ้งข้อยกเว้นที่พวกเขาไม่ต้องการในแง่ของความพยายามในการพัฒนาประสิทธิภาพของโปรแกรมและ ความเรียบง่ายของการไหลของโปรแกรม
anaximander

6
@Darthfett ลองเปรียบเทียบสิ่งนี้กับวิธีการขยาย LINQ ที่มีอยู่: Where () หากฉันมีส่วนคำสั่ง: โดยที่ (x => 1 == 2) ฉันไม่ได้รับข้อยกเว้นฉันจะได้รับชุดว่างเปล่า
Necoras

79

เมื่อสงสัยให้ถามคนอื่น

itertools.combinationsฟังก์ชั่นตัวอย่างของคุณมีหนึ่งที่คล้ายกันมากในหลาม: มาดูกันว่ามันทำงานอย่างไร:

>>> import itertools
>>> input = [1, 2, 3, 4, 5]
>>> list(itertools.combinations(input, 2))
[(1, 2), (1, 3), (1, 4), (1, 5), (2, 3), (2, 4), (2, 5), (3, 4), (3, 5), (4, 5)]
>>> list(itertools.combinations(input, 5))
[(1, 2, 3, 4, 5)]
>>> list(itertools.combinations(input, 6))
[]

และรู้สึกดีกับฉันอย่างสมบูรณ์ ฉันคาดหวังผลลัพธ์ที่ฉันสามารถทำซ้ำได้และได้รับหนึ่ง

แต่เห็นได้ชัดว่าถ้าคุณถามอะไรโง่ ๆ

>>> list(itertools.combinations(input, -1))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: r must be non-negative

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


ตามที่กล่าวโดย@Bakuriuในความคิดเห็นนี้ยังเป็นเหมือนกันสำหรับแบบสอบถามเหมือนSQL SELECT <columns> FROM <table> WHERE <conditions>ตราบใดที่<columns>, <table>, <conditions>จะดีขึ้นจัดรูปแบบและการอ้างอิงถึงชื่อที่มีอยู่ที่คุณสามารถสร้างชุดของเงื่อนไขที่ไม่รวมกัน InvalidConditionsErrorผลจากแบบสอบถามเพียงแค่จะให้ผลผลิตไม่มีแถวแทนการขว้างปา


4
ลดระดับลงเนื่องจากไม่มีความหมายในพื้นที่ภาษา C # / Linq (ดูคำตอบที่ sbecker ว่าปัญหาขอบเขตที่คล้ายคลึงกันได้รับการจัดการในภาษาใด) ถ้านี่เป็นคำถาม Python มันน่าจะเป็น +1 จากฉัน
James Snell

32
@ JamesSnell ฉันแทบจะไม่เห็นว่าเกี่ยวข้องกับปัญหานอกขอบเขต เราไม่ได้เลือกองค์ประกอบด้วยดัชนีเพื่อเรียงลำดับใหม่เรากำลังเลือกnองค์ประกอบในชุดเพื่อนับจำนวนวิธีที่เราสามารถเลือกได้ หากในบางจุดไม่มีองค์ประกอบที่เหลือในขณะที่เลือกพวกเขาแสดงว่าไม่มีวิธีการเลือกnองค์ประกอบ(0) จากการรวบรวมดังกล่าว
Mathias Ettinger

1
ถึงกระนั้น Python ก็ไม่ใช่ oracle ที่ดีสำหรับคำถาม C #: ตัวอย่างเช่น C # จะยอมให้1.0 / 0Python ไม่ต้องการ
Dmitry Grigoryev

2
@MathiasEttinger แนวทางของ Pythons สำหรับวิธีและเวลาที่จะใช้ข้อยกเว้นแตกต่างกันมากกับ C # ดังนั้นการใช้พฤติกรรมจากโมดูล Python เป็นแนวทางที่ไม่ได้เป็นตัวชี้วัดที่ดีสำหรับ C #
Ant P

2
แทนที่จะเลือก Python เราแค่เลือก SQL ที่ไม่ดีขึ้น SELECTแบบสอบถามมากกว่าตารางการผลิตข้อยกเว้นเมื่อชุดผลลัพธ์เป็นที่ว่างเปล่า? (สปอยเลอร์: ไม่!) "well-formedness" ของแบบสอบถามขึ้นอยู่กับแบบสอบถามและเมตาดาต้าบางตัวเท่านั้น(เช่นตารางมีอยู่และมีฟิลด์นี้ (มีประเภทนี้) หรือไม่) เมื่อแบบสอบถามมีรูปแบบที่ดีและคุณดำเนินการคุณคาดหวังว่า (อาจว่างเปล่า) ผลลัพธ์ที่ถูกต้องหรือข้อยกเว้นเพราะ "เซิร์ฟเวอร์" มีปัญหา (เช่นเซิร์ฟเวอร์ db ลงหรือบางสิ่ง)
Bakuriu

72

ในแง่ของคนธรรมดา:

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

23
+1, 0 นั้นถูกต้องสมบูรณ์และมีความสำคัญอย่างยิ่ง มีหลายกรณีที่ข้อความค้นหาอาจส่งคืนศูนย์ที่ถูกต้องตามกฎหมายซึ่งการเพิ่มข้อยกเว้นนั้นน่ารำคาญอย่างมาก
Kilian Foth

19
คำแนะนำที่ดี แต่คำตอบของคุณชัดเจนหรือไม่
Ewan

54
ฉันยังคงไม่ฉลาดที่จะถ้าคำตอบนี้แสดงให้เห็น OP ควรthrowหรือกลับชุดว่างเปล่า ...
เจมส์ปราดเปรื่อง

7
คำตอบของคุณบอกว่าฉันสามารถทำอย่างใดอย่างหนึ่งขึ้นอยู่กับว่ามีข้อผิดพลาด แต่คุณไม่ได้พูดถึงว่าคุณจะพิจารณาสถานการณ์ตัวอย่างเป็นข้อผิดพลาด ในความคิดเห็นข้างต้นคุณบอกว่าฉันควรคืนเซตว่าง "ถ้าไม่มีปัญหา" แต่อีกครั้งเงื่อนไขที่ไม่น่าพอใจอาจถูกพิจารณาว่าเป็นปัญหาได้ แล้วฉันควรทำยังไงดี?
Anaximander

3
อ้าฉันเข้าใจแล้วคุณอาจเข้าใจผิด ฉันไม่ได้ผูกมัดอะไรฉันกำลังเขียนวิธีที่ฉันคาดว่าจะนำมาใช้ในห่วงโซ่ ฉันสงสัยว่านักพัฒนาในอนาคตสมมุติที่ใช้วิธีนี้จะต้องการให้โยนในสถานการณ์ข้างต้น
Anaximander

53

ฉันเห็นด้วยกับคำตอบของ Ewanแต่ต้องการเพิ่มเหตุผลเฉพาะ

คุณกำลังเผชิญกับการดำเนินการทางคณิตศาสตร์ดังนั้นจึงอาจเป็นคำแนะนำที่ดีที่จะใช้นิยามทางคณิตศาสตร์ที่เหมือนกัน จากมุมมองทางคณิตศาสตร์จำนวนr -sets ของn- set (เช่นnCr ) ถูกกำหนดไว้อย่างดีสำหรับทุก r> n> = 0 มันเป็นศูนย์ ดังนั้นการคืนชุดว่างจะเป็นกรณีที่คาดหวังจากมุมมองทางคณิตศาสตร์


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

1
ดีกว่าคำตอบของ Ewans มากเพราะมันอ้างถึงการฝึกฝนทางคณิตศาสตร์ +1
949300

24

ฉันพบวิธีที่ดีในการพิจารณาว่าจะใช้ข้อยกเว้นคือการจินตนาการว่าผู้คนมีส่วนร่วมในการทำธุรกรรม

การดึงเนื้อหาของไฟล์เป็นตัวอย่าง:

  1. โปรดดึงเนื้อหาของไฟล์ "ไม่อยู่"

    "นี่คือเนื้อหา: ชุดอักขระว่าง"

    ข "เอ่อมีปัญหาไฟล์นั้นไม่มีอยู่ฉันไม่รู้จะทำยังไง!"

  2. โปรดดึงเนื้อหาของไฟล์ "มีอยู่ แต่ว่างเปล่า"

    "นี่คือเนื้อหา: ชุดอักขระว่าง"

    ข "เอ่อมีปัญหาไม่มีอะไรในไฟล์นี้ฉันไม่รู้จะทำยังไง!"

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

ดังนั้นการใช้วิธีการเดียวกันกับตัวอย่างของคุณ:

  1. กรุณาให้ฉันทั้งหมดรวม 4 รายการสำหรับ {1, 2, 3}

    ไม่มีเลยนี่เป็นเซตว่างเปล่า

    ข มีปัญหาฉันไม่รู้จะทำอย่างไร

อีกครั้ง "มีปัญหา" จะสมเหตุสมผลถ้าnullมีการนำเสนอเช่นชุดของรายการ แต่ "นี่เป็นชุดที่ว่างเปล่า" ดูเหมือนว่าการตอบสนองที่เหมาะสมกับการร้องขอข้างต้น

หากส่งคืนค่าว่างจะทำให้เกิดปัญหา (เช่นไฟล์ที่ขาดหายไปกnull) ดังนั้นโดยทั่วไปควรใช้ข้อยกเว้นแทน (เว้นแต่ว่าภาษาที่คุณเลือกจะรองรับoption/maybeประเภท มิฉะนั้นการคืนค่าเปล่าจะทำให้ต้นทุนลดลงและเป็นไปตามหลักการที่น่าประหลาดใจน้อยที่สุด


4
คำแนะนำนี้เป็นสิ่งที่ดี แต่ไม่ได้ใช้กับกรณีนี้ ตัวอย่างที่ดีกว่า: กี่วันหลังจากวันที่ 30: มกราคม: 1 กี่วันหลังจากวันที่ 30 กุมภาพันธ์: กี่วันหลังจากวันที่ 30: กี่วัน: ข้อยกเว้นกี่ชั่วโมงทำงานในวันที่ 30 : th of February: Exception
Guran

9

เนื่องจากมันมีไว้สำหรับไลบรารีวัตถุประสงค์ทั่วไปสัญชาตญาณของฉันก็คือให้ผู้ใช้เลือกได้

เหมือนที่เรามีParse()และTryParse()มีให้เราเราสามารถมีตัวเลือกที่เราใช้ขึ้นอยู่กับสิ่งที่เราต้องการออกจากฟังก์ชั่น คุณจะใช้เวลาน้อยลงในการเขียนและบำรุงรักษา wrapper ฟังก์ชันเพื่อให้เกิดข้อยกเว้นมากกว่าการพิจารณาเลือกรุ่นเดียวของฟังก์ชั่น


3
+1 เพราะฉันชอบแนวคิดในการเลือกอยู่เสมอและเนื่องจากรูปแบบนี้มีแนวโน้มที่จะสนับสนุนให้โปรแกรมเมอร์ตรวจสอบอินพุตของตนเอง การมีอยู่ของฟังก์ชัน TryFoo ทำให้เห็นได้ชัดว่าการรวมอินพุตบางอย่างอาจทำให้เกิดปัญหาและหากเอกสารอธิบายว่าปัญหาที่อาจเกิดขึ้นคืออะไร coder สามารถตรวจสอบพวกเขาและจัดการอินพุตที่ไม่ถูกต้องในรูปแบบที่สะอาดกว่าพวกเขา หรือตอบสนองต่อชุดที่ว่างเปล่า หรือพวกเขาอาจขี้เกียจ การตัดสินใจเป็นของพวกเขา
aleppke

19
ไม่ชุดที่ว่างเปล่าคือคำตอบที่ถูกต้องทางคณิตศาสตร์ การทำอย่างอื่นคือนิยามใหม่ของคณิตศาสตร์ที่ตกลงร่วมกันอย่างแน่นแฟ้นซึ่งไม่ควรทำในสิ่งที่ต้องการ ในขณะที่เราอยู่ที่นี่เราจะต้องนิยามฟังก์ชันการยกกำลังอีกครั้งเพื่อให้เกิดข้อผิดพลาดถ้าเลขชี้กำลังเท่ากับศูนย์เพราะเราตัดสินใจว่าเราไม่ชอบอนุสัญญาที่จำนวนใดก็ตามที่ยกกำลังเป็นศูนย์ "เลขศูนย์" เท่ากับ 1 หรือไม่
Wildcard

1
ฉันกำลังจะตอบสิ่งที่คล้ายกัน วิธีการขยาย Linq Single()และSingleOrDefault()ผุดขึ้นในใจทันที โสดพ่นยกเว้นถ้ามีศูนย์หรือ> 1 ผลขณะ SingleOrDefault default(T)จะไม่โยนและแทนที่จะผลตอบแทน บางที OP สามารถใช้และCombinationsOf() CombinationsOfOrThrow()
RubberDuck

1
@ Wildcard - คุณกำลังพูดถึงผลลัพธ์ที่แตกต่างกันสองรายการไปยังอินพุตเดียวกันซึ่งไม่เหมือนกัน OP มีความสนใจเฉพาะในการเลือก a) ผลลัพธ์หรือ b) การโยนข้อยกเว้นที่ไม่ใช่ผลลัพธ์
James Snell

4
SingleและSingleOrDefault(หรือFirstและFirstOrDefault) เป็นเรื่องราวที่แตกต่างอย่างสิ้นเชิง @RubberDuck ยกตัวอย่างจากความคิดเห็นก่อนหน้าของฉัน มันสมบูรณ์ดีเพื่อ Anser ไม่มีในแบบสอบถาม"สิ่งที่แม้ primes มากกว่าสองอยู่?" เนื่องจากนี่เป็นคำตอบทางเสียงและทางคณิตศาสตร์ที่สมเหตุสมผล อย่างไรก็ตามถ้าคุณถามว่า"อะไรคือสิ่งที่สำคัญยิ่งกว่าสอง?" ไม่มีคำตอบที่เป็นธรรมชาติ คุณไม่สามารถตอบคำถามได้เพราะคุณขอหมายเลขเดียว ไม่ใช่ไม่ใช่ (ไม่ใช่ตัวเลขเดียว แต่เป็นเซต) ไม่ใช่ 0 ดังนั้นเราจึงได้ข้อยกเว้น
Paul Kertscher

4

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

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

เป็นตัวอย่างให้ตรวจสอบ public static TSource ElementAt<TSource>(this IEnumerable<TSource>, Int32)ฟังก์ชั่นใน Linq ซึ่งจะโยน ArgumentOutOfRangeException หากดัชนีน้อยกว่า 0 หรือมากกว่าหรือเท่ากับจำนวนองค์ประกอบในแหล่งที่มา ดังนั้นดัชนีจะถูกตรวจสอบเกี่ยวกับการนับที่จัดทำโดยผู้โทร


3
+1 สำหรับการอ้างอิงตัวอย่างของสถานการณ์ที่คล้ายกันในภาษา
James Snell

13
อย่างผิดปกติตัวอย่างของคุณทำให้ฉันคิดและนำฉันไปสู่สิ่งที่ฉันคิดว่าทำให้ตัวอย่างที่แข็งแกร่ง ดังที่ฉันได้กล่าวไว้วิธีการนี้ได้รับการออกแบบให้คล้ายกับ LINQ เพื่อให้ผู้ใช้สามารถโยงมันเข้ากับวิธีอื่น ๆ ของ LINQ หากคุณnew[] { 1, 2, 3 }.Skip(4).ToList();ได้รับชุดที่ว่างเปล่าซึ่งทำให้ฉันคิดว่าการส่งคืนชุดที่ว่างเปล่าอาจเป็นตัวเลือกที่ดีกว่าที่นี่
Anaximander

14
นี่ไม่ใช่ปัญหาเกี่ยวกับความหมายของภาษาความหมายของโดเมนปัญหามีคำตอบที่ถูกต้องอยู่แล้วนั่นคือคืนชุดเปล่า การทำสิ่งอื่นใดเป็นการละเมิดหลักความประหลาดใจอย่างน้อยที่สุดสำหรับคนที่ทำงานในโดเมนปัญหา combinatoric
Ukko

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

2
@sbecker เพื่อนำมาที่บ้านจุด: ถ้าคำถามคือ "วิธีการหลายชุดที่มีของ ..." แล้ว "ศูนย์" จะเป็นคำตอบที่ถูกต้องสมบูรณ์ ในทำนองเดียวกันว่า "สิ่งที่มีอยู่รวมกันดังกล่าวว่า ..." มีชุดที่ว่างเปล่าเป็นคำตอบที่ถูกต้องสมบูรณ์ หากคำถามคือ "การรวมกันครั้งแรกคืออะไร" ... แล้วจะมีข้อยกเว้นเท่านั้นจึงจะเหมาะสมเนื่องจากคำถามนั้นไม่สามารถตอบได้ ดูเพิ่มเติมความคิดเห็นของพอลค
สัญลักษณ์ตัวแทน

3

คุณควรทำอย่างใดอย่างหนึ่งต่อไปนี้ (แม้ว่าจะยังคงมีการทิ้งปัญหาพื้นฐานอย่างต่อเนื่องเช่นจำนวนชุดค่าลบ):

  1. จัดเตรียมการนำไปใช้สองแบบชุดหนึ่งที่ส่งคืนชุดว่างเมื่ออินพุตเข้าด้วยกันนั้นไร้ความหมายและอีกชุดหนึ่งที่ส่งออกมา ลองเรียกพวกเขาและCombinationsOf CombinationsOfWithInputCheckหรืออะไรก็ได้ที่คุณชอบ CombinationsOfAllowInconsistentParametersคุณสามารถย้อนกลับนี้เพื่อให้การป้อนข้อมูลการตรวจสอบอย่างใดอย่างหนึ่งเป็นชื่อที่สั้นและรายการหนึ่งคือ

  2. สำหรับวิธีการของ Linq ให้คืนค่าว่างIEnumerableในหลักฐานที่คุณได้กำหนดไว้ จากนั้นเพิ่มวิธี Linq เหล่านี้ในห้องสมุดของคุณ:

    public static class EnumerableExtensions {
       public static IEnumerable<T> ThrowIfEmpty<T>(this IEnumerable<T> input) {
          return input.IfEmpty<T>(() => {
             throw new InvalidOperationException("An enumerable was unexpectedly empty");
          });
       }
    
       public static IEnumerable<T> IfEmpty<T>(
          this IEnumerable<T> input,
          Action callbackIfEmpty
       ) {
          var enumerator = input.GetEnumerator();
          if (!enumerator.MoveNext()) {
             // Safe because if this throws, we'll never run the return statement below
             callbackIfEmpty();
          }
          return EnumeratePrimedEnumerator(enumerator);
       }
    
       private static IEnumerable<T> EnumeratePrimedEnumerator<T>(
          IEnumerator<T> primedEnumerator
       ) {
          yield return primedEnumerator.Current;
          while (primedEnumerator.MoveNext()) {
             yield return primedEnumerator.Current;
          }
       }
    }

    ในที่สุดใช้สิ่งที่ชอบโดยทำดังนี้

    var result = someInputSet
       .CombinationsOf(4, CombinationsGenerationMode.Distinct)
       .ThrowIfEmpty()
       .Select(combo => /* do some operation to a combination */)
       .ToList();

    หรือเช่นนี้

    var result = someInputSet
       .CombinationsOf(4, CombinationsGenerationMode.Distinct)
       .IfEmpty(() => _log.Warning(
          $@"Unexpectedly received no results when creating combinations for {
             nameof(someInputSet)}"
       ))
       .Select(combo => /* do some operation to a combination */)
       .ToList();

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

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

ฉันคิดว่า # 2 ค่อนข้างดีเยี่ยม! ตอนนี้กำลังอยู่ในการเรียกรหัสและผู้อ่านคนต่อไปของรหัสจะเข้าใจสิ่งที่มันกำลังทำอยู่และไม่ต้องจัดการกับข้อยกเว้นที่ไม่คาดคิด


โปรดอธิบายสิ่งที่คุณหมายถึง สิ่งที่อยู่ในโพสต์ของฉัน "ไม่ทำงานเหมือนชุด" และทำไมเป็นสิ่งที่ไม่ดี?
ErikE

โดยทั่วไปแล้วคุณตอบคำถามของฉันเหมือนกันแทนที่จะห่อคำที่คุณชื่นชอบเพื่อค้นหาเงื่อนไขถ้าผลลัพธ์จะไม่เปลี่ยน uu
GameDeveloper

ฉันไม่เห็นว่าคำตอบของฉันคือ "ตอบแบบเดียวกับ" คำตอบของคุณ พวกเขาดูเหมือนแตกต่างอย่างสิ้นเชิงกับฉัน
ErikE

โดยทั่วไปคุณเพียงแค่บังคับใช้เงื่อนไขเดียวกันของ "ชั้นเรียนของฉันไม่ดี" แต่คุณไม่ได้บอกว่า ^^ คุณเห็นด้วยหรือไม่ว่าคุณกำลังบังคับใช้องค์ประกอบ 1 รายการในผลลัพธ์แบบสอบถาม
GameDeveloper

คุณจะต้องพูดให้ชัดเจนยิ่งขึ้นสำหรับโปรแกรมเมอร์โง่ ๆ ที่ยังไม่เข้าใจสิ่งที่คุณกำลังพูดถึง คลาสไหนไม่ดี ทำไมมันไม่ดี? ฉันไม่ได้บังคับอะไร ฉันอนุญาตให้ USER ของชั้นเรียนตัดสินใจพฤติกรรมสุดท้ายแทน CREATOR ของชั้นเรียน วิธีนี้ช่วยให้สามารถใช้กระบวนทัศน์การเข้ารหัสที่สอดคล้องกันได้ซึ่งวิธีการของ Linq ไม่ได้ทำการสุ่มเนื่องจากความสามารถในการคำนวณที่ไม่ได้ละเมิดกฎปกติอย่างแท้จริงเช่นถ้าคุณขอ -1 รายการต่อครั้ง
ErikE

2

ฉันสามารถดูข้อโต้แย้งสำหรับทั้งสองกรณีการใช้งาน - ข้อยกเว้นเป็นสิ่งที่ดีถ้ารหัสดาวน์สตรีมคาดว่าชุดที่มีข้อมูล ในทางกลับกันชุดเปล่าจะดีมากหากคาดว่าจะเป็นเช่นนี้

ฉันคิดว่ามันขึ้นอยู่กับความคาดหวังของผู้โทรหากนี่เป็นข้อผิดพลาดหรือผลลัพธ์ที่ยอมรับได้ดังนั้นฉันจะถ่ายโอนตัวเลือกไปยังผู้โทร อาจจะแนะนำตัวเลือก?

.CombinationsOf(4, CombinationsGenerationMode.Distinct, Options.AllowEmptySets)


10
ในขณะที่ฉันได้รับสิ่งที่คุณกำลังทำอยู่ฉันพยายามหลีกเลี่ยงวิธีการที่มีตัวเลือกมากมายที่ส่งผ่านไปเพื่อแก้ไขพฤติกรรม ฉันยังไม่พอใจ 100% กับโหมด enum ที่มีอยู่แล้ว ฉันไม่ชอบความคิดของพารามิเตอร์ตัวเลือกที่เปลี่ยนพฤติกรรมการยกเว้นของวิธีการ ฉันรู้สึกว่าหากวิธีการจำเป็นต้องโยนข้อยกเว้นมันต้องโยน; หากคุณต้องการซ่อนข้อยกเว้นนั่นเป็นการตัดสินใจของคุณในฐานะรหัสโทรและไม่ใช่สิ่งที่คุณสามารถทำให้รหัสของฉันทำได้ด้วยตัวเลือกการป้อนที่ถูกต้อง
Anaximander

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

2

มีสองวิธีในการตัดสินใจว่าไม่มีคำตอบที่ชัดเจนหรือไม่:

  • เขียนรหัสสมมติตัวเลือกแรกจากนั้นตัวเลือกอื่น พิจารณาว่าอันไหนดีที่สุดในการปฏิบัติ

  • เพิ่มพารามิเตอร์บูลีน "เข้มงวด" เพื่อระบุว่าคุณต้องการให้พารามิเตอร์ตรวจสอบอย่างเข้มงวดหรือไม่ ตัวอย่างเช่น Java SimpleDateFormatมีsetLenientวิธีการแยกวิเคราะห์อินพุตที่ไม่ตรงกับรูปแบบทั้งหมด แน่นอนคุณต้องตัดสินใจว่าค่าเริ่มต้นคืออะไร


2

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

หากคุณรู้สึกว่าผู้ใช้บางคนอาจต้องการบังคับให้ส่งคืนที่ไม่มีข้อมูลให้พวกเขามีวิธีที่จะถามถึงพฤติกรรมนั้นแทนที่จะบังคับใช้กับทุกคน ตัวอย่างเช่นคุณอาจ:

  • ทำให้เป็นตัวเลือกการกำหนดค่าบนวัตถุใด ๆ ที่กำลังทำการกระทำสำหรับผู้ใช้
  • ทำให้เป็นค่าสถานะที่ผู้ใช้สามารถเลือกให้ส่งผ่านฟังก์ชันได้
  • ให้AssertNonemptyเช็คที่พวกเขาสามารถใส่ไว้ในโซ่ของพวกเขา
  • ทำให้ทั้งสองฟังก์ชั่นหนึ่งฟังก์ชั่นที่ไม่ว่างเปล่าและอีกฟังก์ชั่นหนึ่งที่ไม่รองรับ

สิ่งนี้ดูเหมือนจะไม่นำเสนออะไรมากมายเกินกว่าที่ทำคะแนนและอธิบายไว้ใน 12 คำตอบก่อนหน้านี้
ริ้น

1

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

  • หากคุณกลับมาInfในห้องสมุด Python ผู้คนจะโจมตีคุณเนื่องจากการซ่อนข้อผิดพลาด
  • หากคุณเกิดข้อผิดพลาดในไลบรารี Matlab ผู้คนจะโจมตีคุณเนื่องจากไม่สามารถประมวลผลข้อมูลด้วยค่าที่หายไป

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

โซลูชันที่ให้ผู้ใช้เลือก (เช่นการเพิ่มพารามิเตอร์ "เข้มงวด") ไม่ชัดเจนเนื่องจากพวกเขาแทนที่คำถามเดิมด้วยคำถามใหม่ที่เทียบเท่า: "ค่าใดstrictควรเป็นค่าเริ่มต้น"


2
ฉันคิดเกี่ยวกับการใช้อาร์กิวเมนต์ NaN ในคำตอบของฉันและฉันแบ่งปันความคิดเห็นของคุณ เราไม่สามารถบอกเพิ่มเติมได้โดยไม่ทราบว่าโดเมนของ OP
GameDeveloper

0

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

กฎชุดทั่วไป:

  • Set.Foreach (กริยา); // คืนค่าเป็นจริงเสมอสำหรับเซตว่าง
  • Set.Exists (กริยา); // ส่งคืนค่า false สำหรับชุดว่างเสมอ

คำถามของคุณลึกซึ้งมาก:

  • อาจเป็นได้ว่าอินพุตของฟังก์ชันของคุณต้องเคารพสัญญา :ในกรณีนั้นอินพุตที่ไม่ถูกต้องใด ๆ ควรเพิ่มข้อยกเว้นนั่นก็คือฟังก์ชั่นไม่ทำงานภายใต้พารามิเตอร์ปกติ

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

ตอนนี้ถ้าฉันอยู่ในคุณฉันจะไปทาง "ชุด" แต่ด้วย "BUT" ขนาดใหญ่

สมมติว่าคุณมีคอลเลกชันที่ "โดย hypotesis" ควรมีนักเรียนหญิงเท่านั้น:

class FemaleClass{

    FemaleStudent GetAnyFemale(){
        var femaleSet= mySet.Select( x=> x.IsFemale());
        if(femaleSet.IsEmpty())
            throw new Exception("No female students");
        else
            return femaleSet.Any();
    }
}

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

เมื่อคุณใช้ "ตั้ง" ฟังก์ชั่นในทางที่บริสุทธิ์ของคุณที่คุณไม่ควรโยนข้อยกเว้นในกรณีของชุดที่ว่างเปล่า แต่ถ้าคุณมีคอลเลกชันที่มีไม่มาก "ชุดบริสุทธิ์" แล้วคุณควรจะโยนข้อยกเว้นที่เหมาะสม

คุณควรทำในสิ่งที่รู้สึกเป็นธรรมชาติและสอดคล้องกันมากขึ้น: สำหรับฉันชุดหนึ่งควรยึดติดกับกฎในขณะที่สิ่งที่ไม่ได้กำหนดควรมีกฎความคิดที่ถูกต้อง

ในกรณีของคุณมันเป็นความคิดที่ดีที่จะทำ:

List SomeMethod( Set someInputSet){
    var result = someInputSet
        .CombinationsOf(4, CombinationsGenerationMode.Distinct)
        .Select(combo => /* do some operation to a combination */)
        .ToList();

    // the only information here is that set is empty => there are no combinations

    // BEWARE! if 0 here it may be invalid input, but also a empty set
    if(result.Count == 0)  //Add: "&&someInputSet.NotEmpty()"

    // we go a step further, our API require combinations, so
    // this method cannot satisfy the API request, then we throw.
         throw new Exception("you requsted impossible combinations");

    return result;
}

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

Infact เพิ่มความซับซ้อนใหม่เพียงเพื่อแสดงว่าคุณสามารถเขียนวิธีการสืบค้น linq ดูเหมือนจะไม่คุ้มค่าสำหรับปัญหาของคุณฉันค่อนข้างแน่ใจว่าถ้า OP สามารถบอกเราเพิ่มเติมเกี่ยวกับโดเมนของมันได้เราอาจจะหาจุดที่ต้องการยกเว้น เป็นไปได้ว่าปัญหาไม่จำเป็นต้องมีข้อยกเว้นใด ๆ เลย)


ปัญหาคือว่าคุณกำลังใช้วัตถุที่กำหนดทางคณิตศาสตร์เพื่อแก้ไขปัญหา แต่ปัญหานั้นอาจไม่ต้องการวัตถุที่กำหนดทางคณิตศาสตร์เป็นคำตอบ (infact ที่นี่ส่งคืนรายการ) ทุกอย่างขึ้นอยู่กับปัญหาในระดับที่สูงขึ้นไม่ว่าคุณจะแก้ปัญหาอย่างไรนั้นเรียกว่าการซ่อนข้อมูล / การซ่อนข้อมูล
GameDeveloper

เหตุผลที่ "SomeMethod" ของคุณไม่ควรทำตัวเหมือนชุดอีกต่อไปคือคุณกำลังขอข้อมูลชิ้นส่วน "out of Sets" โดยเฉพาะดูที่ส่วนที่แสดงความคิดเห็น "&& someInputSet.NotEmpty ()"
GameDeveloper

1
NO! คุณไม่ควรโยนข้อยกเว้นในชั้นเรียนของคุณผู้หญิง คุณควรใช้รูปแบบของตัวสร้างซึ่งบังคับให้คุณไม่สามารถแม้แต่รับอินสแตนซ์ของFemaleClassมันได้ยกเว้นว่ามันจะมี แต่ตัวเมียเท่านั้น (มันไม่สามารถสร้างได้แบบสาธารณะเท่านั้นคลาสตัวสร้างเท่านั้นที่สามารถแจกอินสแตนซ์ได้) และอาจมีตัวเมียอย่างน้อยหนึ่งตัว . จากนั้นโค้ดของคุณทั่วทุกสถานที่ที่ใช้FemaleClassเป็นอาร์กิวเมนต์ไม่ต้องจัดการกับข้อยกเว้นเนื่องจากวัตถุอยู่ในสถานะที่ไม่ถูกต้อง
ErikE

คุณกำลังสมมติว่าคลาสนั้นเรียบง่ายจนคุณสามารถบังคับใช้เงื่อนไขเบื้องต้นได้โดยผู้สร้างในความเป็นจริง ข้อโต้แย้งของคุณมีข้อบกพร่อง ถ้าคุณห้ามไม่ให้มีผู้หญิงอีกต่อไปแล้วหรือคุณไม่มีวิธีในการลบ studends ออกจากชั้นเรียนหรือวิธีการของคุณจะต้องมีข้อยกเว้นเมื่อมีนักเรียนเหลืออีก 1 คน คุณเพิ่งย้ายปัญหาของฉันที่อื่น ประเด็นก็คือจะมีบางสถานะก่อนหน้าที่ / ฟังก์ชั่นที่ไม่สามารถรักษา "โดยการออกแบบ" และผู้ใช้จะแตก: นั่นเป็นเหตุผลว่าทำไมมีข้อยกเว้น! นี่เป็นสิ่งเชิงทฤษฎีผมหวังว่าการลงคะแนนเสียงไม่ใช่ของคุณ
GameDeveloper

Downvote ไม่ใช่ของฉัน แต่ถ้าเป็นเช่นนั้นฉันจะภูมิใจในสิ่งนั้น ฉันลงคะแนนอย่างระมัดระวัง แต่ด้วยความเชื่อมั่น หากกฎของชั้นเรียนของคุณคือมันต้องมีรายการในนั้นและรายการทั้งหมดจะต้องตรงตามเงื่อนไขที่เฉพาะเจาะจงแล้วให้ชั้นเรียนที่จะอยู่ในสถานะที่ไม่สอดคล้องกันเป็นความคิดที่ไม่ดี การย้ายปัญหาไปที่อื่นเป็นความตั้งใจของฉันอย่างแน่นอน! ฉันต้องการให้ปัญหาเกิดขึ้นที่เวลาสร้างไม่ใช่เวลาใช้งาน จุดประสงค์ของการใช้คลาส Builder แทนการสร้างคอนสตรัคชันคือคุณสามารถสร้างสถานะที่ซับซ้อนมากในหลาย ๆ ชิ้นส่วนผ่านความไม่สอดคล้องกัน
ErikE
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.