คำตอบปัจจุบันทั้งคู่ดูเหมือนจะทำเครื่องหมายเพียงบางส่วนและพวกเขามุ่งเน้นไปที่ตัวอย่างที่ทำให้แนวคิดหลักสำคัญยิ่งขึ้น สิ่งนี้ไม่ได้เป็นเพียงหลักการ OOP แต่เป็นหลักการออกแบบซอฟต์แวร์โดยทั่วไป
สิ่งที่ "แตกต่าง" ในวลีนี้คือรหัส Christophe กำลังบอกว่ามันมักจะเป็นสิ่งที่อาจแตกต่างกันนั่นคือคุณมักจะคาดหวังสิ่งนี้ เป้าหมายคือเพื่อป้องกันตัวเองจากการเปลี่ยนแปลงในอนาคตของรหัส นี้จะเกี่ยวข้องอย่างใกล้ชิดกับการเขียนโปรแกรมกับอินเตอร์เฟซ อย่างไรก็ตาม Christophe นั้นไม่ถูกต้องที่จะ จำกัด สิ่งนี้ไว้ที่ "รายละเอียดการใช้งาน" ในความเป็นจริงค่าของคำแนะนำนี้มักจะเกิดจากการเปลี่ยนแปลงในความต้องการ
นี่เป็นเพียงความเกี่ยวข้องทางอ้อมกับรัฐแค็ปซูลซึ่งเป็นสิ่งที่ฉันเชื่อว่าดาวิดอาร์โนกำลังคิด คำแนะนำนี้ไม่เสมอไป (แต่บ่อยครั้ง) แนะนำการห่อหุ้มของรัฐและคำแนะนำนี้ใช้ได้กับวัตถุที่ไม่เปลี่ยนรูปแบบเช่นกัน ที่จริงแล้วการตั้งชื่อค่าคงที่เป็นเพียงรูปแบบพื้นฐานของการห่อหุ้มสิ่งที่แตกต่างกันไป
CandiedOrange conflates "สิ่งที่แตกต่าง" กับ "รายละเอียด" อย่างชัดเจน สิ่งนี้ถูกต้องเพียงบางส่วนเท่านั้น ฉันยอมรับว่ารหัสใด ๆ ที่แตกต่างกันคือ "รายละเอียด" ในบางแง่มุม แต่ "รายละเอียด" อาจไม่แตกต่างกัน (เว้นแต่คุณจะกำหนด "รายละเอียด" เพื่อสร้างความซ้ำซากนี้) อาจมีเหตุผลที่จะแค็ปซูลรายละเอียดที่ไม่แตกต่างกัน แต่ dictum นี้ไม่ใช่หนึ่ง ถ้าคุณมีความมั่นใจอย่างสูงว่า "สุนัข", "แมว" และ "เป็ด" จะเป็นประเภทเดียวที่คุณต้องจัดการกับปัญหาแล้วคำสั่งนี้ไม่แนะนำให้ทำการปรับโครงสร้าง CandiedOrange
การคัดเลือกตัวอย่างของ CandiedOrange ในบริบทอื่นสมมติว่าเรามีภาษาขั้นตอนเช่น C หากฉันมีรหัสบางส่วนที่มี:
if (pet.type() == dog) {
pet.bark();
} else if (pet.type() == cat) {
pet.meow();
} else if (pet.type() == duck) {
pet.quack()
}
ฉันคาดหวังอย่างสมเหตุสมผลว่ารหัสชิ้นนี้จะเปลี่ยนแปลงในอนาคต ฉันสามารถ "แค็ปซูล" ได้ง่ายๆโดยการกำหนดโพรซีเดอร์ใหม่:
void speak(pet) {
if (pet.type() == dog) {
pet.bark();
} else if (pet.type() == cat) {
pet.meow();
} else if (pet.type() == duck) {
pet.quack()
}
}
และใช้โพรซีเดอร์ใหม่นี้แทนการบล็อกรหัส (เช่น "การแยกวิธี" การปรับโครงสร้างใหม่) ณ จุดนี้การเพิ่มประเภท "วัว" หรือสิ่งที่ต้องการเพียงแค่การปรับปรุงspeak
ขั้นตอน แน่นอนในภาษา OO คุณอาจใช้ประโยชน์จากการจัดส่งแบบไดนามิกตามคำตอบของ CandiedOrange สิ่งนี้จะเกิดขึ้นตามธรรมชาติถ้าคุณเข้าถึงpet
ผ่านอินเทอร์เฟซ การกำจัดตรรกะตามเงื่อนไขผ่านการจัดส่งแบบไดนามิกเป็นข้อกังวลแบบ orthogonal ซึ่งเป็นส่วนหนึ่งของสาเหตุที่ฉันทำขั้นตอนการกระทำนี้ ฉันยังต้องการที่จะเน้นว่าสิ่งนี้ไม่ต้องการคุณลักษณะเฉพาะสำหรับ OOP แม้แต่ในภาษา OO การห่อหุ้มสิ่งที่แตกต่างกันไม่ได้แปลว่าจำเป็นต้องสร้างคลาสหรืออินเทอร์เฟซใหม่
เป็นตัวอย่างตามแบบฉบับที่มากขึ้น (ซึ่งใกล้เคียงกับ แต่ไม่มากนัก) บอกว่าเราต้องการลบรายการที่ซ้ำออกจากรายการ สมมติว่าเราใช้มันโดยวนซ้ำรายการติดตามรายการที่เราเคยเห็นในรายการอื่นและลบรายการใด ๆ ที่เราเคยเห็น มีเหตุผลที่จะสมมติว่าเราอาจต้องการเปลี่ยนวิธีการติดตามรายการที่เห็นอย่างน้อยที่สุดเหตุผลด้านประสิทธิภาพ dictum ที่จะสรุปสิ่งที่แตกต่างกันชี้ให้เห็นว่าเราควรสร้างชนิดข้อมูลนามธรรมเพื่อแสดงชุดของรายการที่เห็น ตอนนี้อัลกอริทึมของเราถูกกำหนดกับชุดข้อมูลแบบนามธรรมนี้และหากเราตัดสินใจที่จะเปลี่ยนเป็นแผนภูมิการค้นหาแบบไบนารีอัลกอริทึมของเราไม่จำเป็นต้องเปลี่ยนหรือดูแล ในภาษา OO เราอาจใช้คลาสหรือส่วนต่อประสานเพื่อจับภาพชนิดข้อมูลนามธรรมนี้ ในภาษาเช่น SML / O '
สำหรับตัวอย่างที่ขับเคลื่อนด้วยความต้องการสมมติว่าคุณจำเป็นต้องตรวจสอบความถูกต้องของข้อมูลบางส่วนโดยคำนึงถึงตรรกะทางธุรกิจบางอย่าง แม้ว่าคุณอาจมีข้อกำหนดเฉพาะในตอนนี้ แต่คุณสงสัยอย่างยิ่งว่าสิ่งเหล่านี้จะมีวิวัฒนาการ คุณอาจแค็ปซูลลอจิกปัจจุบันในโพรซีเดอร์ / ฟังก์ชัน / กฎ / คลาสของตัวเอง
แม้ว่านี่จะเป็นความกังวลมุมฉากซึ่งไม่ได้เป็นส่วนหนึ่งของ "สรุปสิ่งที่แตกต่าง" มันก็มักจะเป็นนามธรรมที่เป็นนามธรรมออกนั่นคือ parameterize โดยตอนนี้สรุปเหตุผล โดยทั่วไปแล้วจะนำไปสู่รหัสที่ยืดหยุ่นมากขึ้นและอนุญาตให้เปลี่ยนตรรกะได้โดยการแทนที่ในการนำไปใช้ทางเลือกแทนการแก้ไขตรรกะที่ห่อหุ้ม