ฉันเพิ่งทำงานในสถานการณ์ต่อไปนี้
class A{
public:
void calculate(T inputs);
}
ประการแรกA
แสดงถึงวัตถุในโลกทางกายภาพซึ่งเป็นข้อโต้แย้งที่แข็งแกร่งที่ไม่แยกชั้นเรียนขึ้น ตอนนี้calculate()
กลายเป็นฟังก์ชั่นที่ค่อนข้างยาวและซับซ้อน ฉันเข้าใจโครงสร้างที่เป็นไปได้สามประการ:
- เขียนเป็นกำแพงข้อความ - ข้อดี - ข้อมูลทั้งหมดอยู่ในที่เดียว
- เขียน
private
ฟังก์ชั่นยูทิลิตี้ในชั้นเรียนและใช้พวกเขาในcalculate
ร่างกาย - ข้อเสีย - ส่วนที่เหลือของชั้นไม่ทราบ / ดูแล / เข้าใจเกี่ยวกับวิธีการเหล่านั้น เขียน
calculate
วิธีดังต่อไปนี้:void A::calculate(T inputs){ auto lambda1 = () [] {}; auto lambda2 = () [] {}; auto lambda3 = () [] {}; lambda1(inputs.first_logical_chunk); lambda2(inputs.second_logical_chunk); lambda3(inputs.third_logical_chunk); }
สิ่งนี้ถือได้ว่าเป็นการปฏิบัติที่ดีหรือไม่ดี? วิธีนี้เปิดเผยปัญหาหรือไม่? โดยรวมแล้วฉันควรพิจารณาว่านี่เป็นแนวทางที่ดีเมื่อฉันต้องเผชิญกับสถานการณ์เดียวกันอีกครั้งหรือไม่?
แก้ไข:
class A{
...
public:
// Reconfiguration of the algorithm.
void set_colour(double colour);
void set_density(double density);
void set_predelay(unsigned long microseconds);
void set_reverb_time(double reverb_time, double room_size);
void set_drywet(double left, double right);
void set_room_size(double value);;
private:
// Sub-model objects.
...
}
วิธีการเหล่านั้นทั้งหมด:
- รับค่า
- คำนวณค่าอื่น ๆ โดยไม่ต้องใช้สถานะ
- เรียก "วัตถุโมเดลย่อย" บางอย่างเพื่อเปลี่ยนสถานะ
ปรากฎว่ายกเว้นset_room_size()
วิธีการเหล่านั้นเพียงแค่ส่งค่าที่ร้องขอไปยังวัตถุย่อย set_room_size()
ในทางกลับกันมีสองหน้าจอของสูตรที่คลุมเครือและ (2) ครึ่งหน้าจอของการเรียกตัวตั้งค่าวัตถุย่อยเพื่อใช้ผลลัพธ์ที่ได้รับต่างๆ ดังนั้นฉันได้แยกฟังก์ชั่นออกเป็นสอง lambdas และเรียกมันว่าท้ายฟังก์ชั่น ถ้าฉันสามารถแยกมันออกเป็นชิ้น ๆ ได้ฉันจะแยกลูกแกะมากขึ้น
โดยไม่คำนึงถึงเป้าหมายของคำถามปัจจุบันคือการพิจารณาว่าวิธีการคิดนั้นควรคงอยู่หรือไม่หรือจะเป็นการเพิ่มคุณค่า (ความสามารถในการอ่านการบำรุงรักษาความสามารถในการดีบักและอื่น ๆ )
Firstly, A represents an object in the physical world, which is a strong argument for not splitting the class up.
แท้จริงA
หมายถึงข้อมูลเกี่ยวกับวัตถุที่สามารถอยู่ในโลกทางกายภาพ คุณสามารถมีอินสแตนซ์ที่A
ไม่มีวัตถุจริงและวัตถุจริงโดยไม่มีตัวอย่างA
ดังนั้นการรักษาพวกเขาเหมือนพวกเขาเป็นหนึ่งและเหมือนกันเป็นเรื่องไร้สาระ
calculate()
จะรู้เกี่ยวกับฟังก์ชั่นย่อยเหล่านั้น
A
นั้นนั่นเป็นการทำให้สุดขีด
A
แสดงให้เห็นถึงวัตถุในโลกทางกายภาพซึ่งเป็นข้อโต้แย้งที่แข็งแกร่งสำหรับการแยกชั้นเรียนไม่ได้" ฉันโชคไม่ดีที่บอกเรื่องนี้เมื่อฉันเริ่มเขียนโปรแกรม ฉันใช้เวลาหลายปีกว่าจะรู้ตัวว่าเป็นกลุ่มของฮอคกี้ มันเป็นเหตุผลที่แย่มากที่จะจัดกลุ่มสิ่งต่าง ๆ ฉันไม่สามารถระบุได้ว่าอะไรคือเหตุผลที่ดีในการจัดกลุ่มสิ่งต่าง ๆ (อย่างน้อยก็เพื่อความพึงพอใจของฉัน) แต่สิ่งนั้นเป็นสิ่งที่คุณควรทิ้งในตอนนี้ ท้ายที่สุดทั้งหมดเป็น "รหัสที่ดี" คือการทำงานที่ถูกต้องค่อนข้างง่ายต่อการเข้าใจและค่อนข้างง่ายต่อการเปลี่ยนแปลง (เช่นการเปลี่ยนแปลงไม่มีผลข้างเคียงที่แปลก)