ชี้แจงหลักการความรับผิดชอบเดี่ยว


64

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

คุณจะอธิบายความหมายของ "สิ่งหนึ่ง" ได้อย่างไร อะไรคือสัญญาณที่ชัดเจนว่าชั้นเรียนทำอะไรได้มากกว่า "สิ่งเดียว"?


6
+1 นานกว่า "รหัสราวีโอลี่" ในช่วงต้นของอาชีพของฉันฉันเป็นหนึ่งในคนเหล่านั้นที่เอามันไปไกลเกินไป ไม่เพียงแค่คลาสเท่านั้น แต่ยังรวมถึงวิธีการทำให้เป็นโมดูลด้วยเช่นกัน รหัสของฉันเต็มไปด้วยวิธีการเล็ก ๆ น้อย ๆ ที่ทำอะไรง่าย ๆ เพียงเพื่อแบ่งปัญหาออกเป็นชิ้นเล็ก ๆ ที่พอดีกับหน้าจอโดยไม่ต้องเลื่อน เห็นได้ชัดว่านี่มักจะไปไกลเกินไป
Bobby Tables

คำตอบ:


50

ฉันชอบวิธีที่โรเบิร์ตซีมาร์ติน (ลุงบ็อบ) เรียกคืนหลักการความรับผิดชอบเดี่ยว (เชื่อมโยงกับ PDF) :

ไม่ควรมีเหตุผลมากกว่าหนึ่งข้อในการเปลี่ยนชั้นเรียน

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

ในบทความที่เชื่อมโยงลุง Bob สรุป:

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


2
ฉันชอบวิธีที่เขาพูดเช่นกันดูเหมือนว่าจะง่ายต่อการตรวจสอบเมื่อเกี่ยวข้องกับการเปลี่ยนแปลงมากกว่า "ความรับผิดชอบ" ที่เป็นนามธรรม
Matthieu M.

นั่นเป็นวิธีที่ยอดเยี่ยมที่จะนำมาใช้ ฉันชอบแบบนั้น. ตามปกติแล้วฉันมักจะคิดว่า SRP นั้นใช้วิธีการต่างๆ บางครั้งคลาสก็ต้องทำสองสิ่ง (อาจเป็นคลาสที่เชื่อมระหว่างสองโดเมน) แต่วิธีการก็ไม่ควรทำมากกว่าสิ่งที่คุณสามารถอธิบายได้อย่างชัดเจนด้วยลายเซ็นประเภท
CodexArcanum

1
เพิ่งแสดงสิ่งนี้แก่ผู้สำเร็จการศึกษาของฉัน - การอ่านที่ดีและการเตือนที่ดีสำหรับฉัน
Martijn Verburg

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

18

ฉันถามตัวเองอยู่เสมอว่าปัญหาอะไรที่ SRP พยายามแก้ไข? SRP ช่วยฉันได้เมื่อไหร่? นี่คือสิ่งที่ฉันมาด้วย:

คุณควรปรับโครงสร้างความรับผิดชอบ / ฟังก์ชั่นออกจากคลาสเมื่อ:

1) คุณทำซ้ำการทำงาน (DRY)

2) คุณพบว่ารหัสของคุณต้องการอีกระดับหนึ่งของสิ่งที่เป็นนามธรรมเพื่อช่วยให้คุณเข้าใจมัน (KISS)

3) คุณพบว่าผู้เชี่ยวชาญด้านโดเมนของคุณมีความสามารถในการใช้งานที่แตกต่างจากองค์ประกอบอื่น ๆ (ภาษาที่ใช้กันแพร่หลาย)

คุณไม่ควรปรับโครงสร้างความรับผิดชอบนอกชั้นเรียนเมื่อ:

1) ไม่มีฟังก์ชั่นซ้ำซ้อน

2) ฟังก์ชั่นการใช้งานไม่เหมาะสมนอกบริบทของชั้นเรียนของคุณ ในอีกทางหนึ่งคลาสของคุณจะให้บริบทที่ง่ายต่อการเข้าใจการทำงาน

3) ผู้เชี่ยวชาญด้านโดเมนของคุณไม่มีแนวคิดเรื่องความรับผิดชอบนั้น

มันเกิดขึ้นกับฉันว่าถ้า SRP ถูกนำไปใช้ในวงกว้างเราแลกเปลี่ยนความซับซ้อนประเภทหนึ่ง (พยายามทำให้หัวหรือก้อยของชั้นเรียนมีวิธีมากเกินไปที่จะเข้าไปข้างใน) กับอีกประเภทหนึ่ง (พยายามรักษาผู้ทำงานร่วมกัน / ระดับทั้งหมดของ นามธรรมตรงเพื่อที่จะหาสิ่งที่ชั้นเรียนเหล่านี้จริงทำ)

หากมีข้อสงสัยให้ทิ้งไว้! คุณสามารถ refactor ได้ในภายหลังเมื่อมีกรณีที่ชัดเจนสำหรับมัน

คุณคิดอย่างไร?


แม้ว่าแนวทางเหล่านี้อาจมีหรือไม่มีประโยชน์ แต่ก็ไม่มีอะไรเกี่ยวข้องกับ SRP ตามที่นิยามไว้ใน SOLID ใช่หรือไม่
ร่า

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

4

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


4

คำตอบอยู่ในคำนิยาม

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

ตัวอย่าง:

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

หากในอีกทางหนึ่งถ้าฉันพูดถึงความรับผิดชอบในการจัดการใบแจ้งหนี้ -> การเพิ่มฟังก์ชั่นเล็ก ๆ หลายอัน (เช่นการพิมพ์ใบแจ้งหนี้การปรับปรุงใบแจ้งหนี้ ) ทั้งหมดนั้นอยู่ในขอบเขตนั้น

อย่างไรก็ตามหากโมดูลนั้นเริ่มจัดการกับฟังก์ชั่นใด ๆนอกเหนือจากใบแจ้งหนี้ก็จะอยู่นอกขอบเขตนั้น


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

1
OP กำลังถามว่า "คุณกำหนดความรับผิดชอบได้อย่างไร?" ดังนั้นเมื่อคุณพูดความรับผิดชอบเป็นสิ่งที่คุณกำหนดให้ดูเหมือนว่ามันเป็นเพียงการทำซ้ำคำถาม
Despertar

2

ฉันมักจะดูมันในสองระดับ:

  • ฉันแน่ใจว่าวิธีการของฉันทำได้เพียงสิ่งเดียวและทำได้ดี
  • ฉันเห็นคลาสเป็นกลุ่มตรรกะ (OO) ของวิธีการเหล่านั้นที่แสดงถึงสิ่งหนึ่งที่ดี

ดังนั้นสิ่งที่เหมือนวัตถุโดเมนชื่อ Dog:

Dogเป็นคลาสของฉัน แต่สุนัขสามารถทำสิ่งต่าง ๆ ได้! ผมอาจจะมีวิธีการเช่นwalk(), run()และbite(DotNetDeveloper spawnOfBill)(ขออภัยไม่สามารถต้านทาน; P)

หากDogกลายเป็นเรื่องไม่แน่นอนฉันจะคิดว่ากลุ่มของวิธีการเหล่านั้นสามารถจำลองแบบร่วมกันในชั้นเรียนอื่นเช่นMovementชั้นเรียนซึ่งอาจมีวิธีของฉันwalk()และrun()วิธีการ

ไม่มีกฎที่ยากและรวดเร็วการออกแบบ OO ของคุณจะพัฒนาไปตามกาลเวลา ฉันพยายามที่จะหาส่วนต่อประสานที่ชัดเจน / API สาธารณะรวมถึงวิธีการง่ายๆที่ทำสิ่งหนึ่งและสิ่งหนึ่งที่ดี


กัดควรใช้ตัวอย่างของวัตถุและ DotNetDeveloper ควรเป็นประเภทย่อยของบุคคล (โดยทั่วไปแล้ว!)
Alan Pearce

@Alan - นั่น - แก้ไขแล้วสำหรับคุณ :-)
Martijn Verburg

1

ฉันดูมันมากขึ้นตามบรรทัดของคลาสควรแสดงสิ่งเดียวเท่านั้น จัดสรร @ ตัวอย่าง Karianna ของฉันมีของฉันDogระดับซึ่งมีวิธีการwalk(), และrun() bark()ฉันไม่ได้จะเพิ่มวิธีการmeaow(), squeak(), slither()หรือfly()เพราะผู้ไม่ได้สิ่งที่สุนัขทำ พวกเขาเป็นสิ่งที่สัตว์อื่นทำและสัตว์อื่น ๆ เหล่านั้นจะมีชั้นเรียนของตัวเองเพื่อเป็นตัวแทนของพวกเขา

(BTW ถ้าสุนัขของคุณไม่บินแล้วคุณอาจจะหยุดการขว้างปาเขาออกมาจากหน้าต่าง)


+1 สำหรับ "หากสุนัขของคุณบินได้คุณควรหยุดโยนเขาออกไปนอกหน้าต่าง" :)
Bobby Tables

นอกเหนือจากคำถามว่าคลาสควรเป็นตัวแทนอะไรอินสแตนซ์แสดงอะไร หากหนึ่งในเรื่องที่เกี่ยวกับSeesFoodเป็นลักษณะของDogEyes, Barkเป็นสิ่งที่ทำโดยDogVoiceและEatเป็นสิ่งที่ทำด้วยDogMouthแล้วตรรกะเหมือนif (dog.SeesFood) dog.Eat(); else dog.Bark();จะกลายเป็นif (eyes.SeesFood) mouth.Eat(); else voice.Bark();สูญเสียความรู้สึกใด ๆ ของตัวตนที่ตาปากและเสียงทั้งหมดที่เชื่อมต่อกับ entitity เดียว
supercat

@ supercat เป็นประเด็นที่ยุติธรรมแม้ว่าบริบทเป็นสิ่งสำคัญ หากรหัสที่คุณพูดถึงอยู่ในDogชั้นเรียนแสดงว่าอาจDogเกี่ยวข้องกับรหัสนั้น ถ้าไม่เช่นนั้นคุณอาจจะจบลงด้วยสิ่งที่ต้องการมากกว่าแค่myDog.Eyes.SeesFood eyes.SeesFoodความเป็นไปได้อีกอย่างหนึ่งคือการDogเปิดเผยISeeอินเตอร์เฟสที่ต้องการDog.EyesคุณสมบัติและSeesFoodเมธอด
JohnL

@JohnL: ถ้ากลไกการมองเห็นที่แท้จริงได้รับการดูแลโดยดวงตาของสุนัขโดยพื้นฐานแล้วเช่นเดียวกับแมวหรือม้าลายก็อาจทำให้รู้สึกได้ว่ามีกลไกที่จัดการโดยEyeชั้นเรียน แต่สุนัขควร "เห็น" ใช้ดวงตาแทนการมองเห็นเท่านั้น สุนัขไม่ได้เป็นตา แต่ไม่ได้เป็นเพียงผู้ถือตา มันเป็น "สิ่งที่สามารถ [ดูอย่างน้อยพยายาม] ดู" และควรอธิบายผ่านอินเทอร์เฟซว่าเป็นเช่นนั้น แม้แต่สุนัขตาบอดก็ยังสามารถถูกถามว่ามันเห็นอาหารหรือไม่ มันจะไม่มีประโยชน์มากนักเนื่องจากสุนัขมักจะพูดว่า "ไม่" แต่ไม่มีอันตรายใด ๆ ในการถาม
supercat

จากนั้นคุณจะใช้อินเทอร์เฟซ ISee เหมือนที่ฉันอธิบายในความคิดเห็นของฉัน
JohnL

1

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

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

จากประสบการณ์ของฉันมันง่ายกว่าที่จะรักษาหลักการนี้ในระดับที่ต่ำกว่าซึ่งเป็นเรื่องที่เป็นรูปธรรมมากขึ้น


0

มันเป็นเรื่องของการมีหนึ่งที่ไม่ซ้ำกันrôle

แต่ละคลาสควรดำเนินการต่อโดยชื่อบทบาท บทบาทคือกริยา (ชุด) ที่เกี่ยวข้องกับบริบท

ตัวอย่างเช่น :

ไฟล์จัดเตรียมการเข้าถึงไฟล์ FileManager จัดการวัตถุไฟล์

ข้อมูลการพักทรัพยากรสำหรับหนึ่งทรัพยากรจากไฟล์ ResourceManager ถือและจัดหาทรัพยากรทั้งหมด

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

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

ฉันมักจะสร้างคลาส Manager ที่มีคลาสอื่น ๆ อยู่หลายคลาส เช่นเดียวกับ Factory, Registry และอื่น ๆ ดูคลาส Manager เหมือนหัวหน้ากลุ่มบางคนหัวหน้าวงออเคสตร้าที่แนะนำผู้คนอื่น ๆ ให้ทำงานร่วมกันเพื่อให้ได้แนวคิดระดับสูง เขามีบทบาทหนึ่ง แต่หมายความถึงการทำงานกับบทบาทพิเศษอื่น ๆ ภายใน คุณจะเห็นได้ว่ามันเป็นอย่างไรในการจัดระเบียบ บริษัท : CEO ไม่ใช่ บริษัท ที่มีประสิทธิผลในระดับผลผลิตที่แท้จริง แต่ถ้าเขาไม่ได้อยู่ที่นั่นก็ไม่มีอะไรสามารถทำงานร่วมกันได้อย่างถูกต้อง นั่นคือบทบาทของเขา

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


-1

SRP ไม่ได้เป็นเพียงแค่การแบ่งชั้นเรียน แต่ยังรวมถึงหน้าที่การมอบหมาย

ในตัวอย่าง Dog ที่ใช้ด้านบนอย่าใช้ SRP เป็นเหตุผลเพื่อให้มี 3 คลาสแยกกันเช่น DogBarker, DogWalker ฯลฯ (การทำงานร่วมกันต่ำ) ให้มองไปที่การใช้วิธีการของชั้นเรียนและตัดสินใจว่าพวกเขา "รู้มากเกินไป" หรือไม่ คุณยังสามารถมี dog.walk () ได้ แต่อาจเป็นวิธีการเดิน () ควรมอบหมายให้คนอื่นเรียนในรายละเอียดว่าการเดินสำเร็จได้อย่างไร

ด้วยเหตุนี้เราจึงอนุญาตให้คลาสสุนัขมีเหตุผลหนึ่งที่จะเปลี่ยนแปลง: เนื่องจากสุนัขเปลี่ยนแปลง แน่นอนว่าการรวมสิ่งนี้เข้ากับหลักการ SOLID อื่น ๆ ที่คุณจะขยายสุนัขสำหรับการทำงานใหม่แทนที่จะเปลี่ยน Dog (เปิด / ปิด) และคุณจะฉีดการพึ่งพาของคุณเช่น IMove และ IEat และแน่นอนว่าคุณต้องสร้างส่วนต่อประสานที่แยกต่างหากเหล่านี้ (การแยกอินเตอร์เฟส) สุนัขจะเปลี่ยนเฉพาะเมื่อเราพบข้อผิดพลาดหรือหากสุนัขเปลี่ยนแปลงพื้นฐาน (Liskov Sub ไม่ขยายและลบพฤติกรรม)

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


-1

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

และเหมือนมีคนพูดว่า "การเดินบนน้ำและการออกแบบซอฟต์แวร์จากข้อกำหนดที่ระบุนั้นเป็นเรื่องง่าย

ดังนั้นหากเรากำหนดความรับผิดชอบอย่างเป็นรูปธรรมมากขึ้นเราก็ไม่จำเป็นต้องเปลี่ยนมัน

บางครั้งความรับผิดชอบจะแจ่มชัด แต่บางครั้งมันอาจจะบอบบางและเราต้องตัดสินใจอย่างรอบคอบ

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


-1

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


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

ทำไมเราไม่ควรทำรายการการเปลี่ยนแปลงที่เป็นไปได้มากที่สุด? การออกแบบเก็งกำไร?
kiwicomb123

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

โอเคฉันเข้าใจว่ามันเป็นการละเมิดหลักการ "ไม่จำเป็นต้องใช้ของคุณ"
kiwicomb123

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