ก่อนอื่นฉันอ่านข้อความที่ตัดตอนมาของ Edsger W. Dijkstra ในปี 1974 "ในบทบาทของความคิดทางวิทยาศาสตร์":
ให้ฉันพยายามอธิบายให้คุณฟังว่าอะไรคือรสนิยมของฉันสำหรับการคิดที่ชาญฉลาด มันคือว่าเราเต็มใจที่จะศึกษาในเชิงลึกในแง่มุมของเนื้อหาที่แยกออกมาเพื่อความมั่นคงของตัวเองตลอดเวลาที่รู้ว่าคนนั้นครอบครองตัวเองด้วยแง่มุมใดด้านหนึ่งเท่านั้น เรารู้ว่าโปรแกรมจะต้องถูกต้องและเราสามารถศึกษาได้จากมุมมองนั้นเท่านั้น เรารู้ด้วยว่ามันควรจะมีประสิทธิภาพและเราสามารถศึกษาประสิทธิภาพของมันในอีกวันหนึ่ง ในอีกอารมณ์หนึ่งเราอาจถามตัวเองว่าและถ้าเป็นเช่นนั้น: ทำไมโปรแกรมนี้จึงเป็นที่ต้องการ แต่ไม่มีสิ่งใดได้รับ - ในทางตรงกันข้าม! - โดยจัดการกับแง่มุมต่าง ๆ เหล่านี้พร้อมกัน บางครั้งฉันก็เรียกว่า "การแยกความกังวล" ซึ่งแม้ว่าจะเป็นไปไม่ได้อย่างสมบูรณ์ก็ตาม ยังเป็นเทคนิคเดียวที่มีอยู่สำหรับการจัดลำดับความคิดของคน ๆ หนึ่งที่ฉันรู้ นี่คือสิ่งที่ฉันหมายถึงโดย "การมุ่งความสนใจไปที่บางแง่มุม": มันไม่ได้หมายถึงการเพิกเฉยต่อแง่มุมอื่น ๆ มันแค่ทำความยุติธรรมกับข้อเท็จจริงที่ว่าจากมุมมองของแง่มุมนี้มุมมองอื่น ๆ นั้นไม่เกี่ยวข้อง มันเป็นหนึ่งในใจและหลายแทร็คพร้อมกัน
ฉันเห็นการแยกข้อกังวลที่ทันสมัยพูดคุยเกี่ยวกับการทำให้โค้ดของคุณเป็นโมดูล อย่างไรก็ตามการอ่านคำพูดข้างต้นฉันเข้าใจว่านี่คือการมุ่งความคิดของคุณไปที่งานหนึ่งโดยเฉพาะในขณะที่ไม่ได้มุ่งเน้นด้านอื่น ๆ นี่ไม่ได้แปลว่าจำเป็นต้องแบ่งรหัสออกเป็นส่วนย่อย ๆ
กล่าวคือมีโค้ดอยู่ข้างหน้าคุณว่าในไฟล์เดียวมีแนวคิดของมุมมองพื้นที่เก็บข้อมูลตัวควบคุมการจัดการเหตุการณ์โรงงาน ฯลฯ ทั้งหมดในไฟล์เดียว
สำหรับตัวอย่างสั้น ๆ นี่คือโค้ดบางส่วนที่มีการเข้าถึงข้อมูลและมุมมอง (เอาต์พุต):
$sql = "SELECT * FROM product WHERE id = " . db_input($id);
$row = db_fetch_array(db_query($sql));
<option value="<?=$row['id']?>"<?= $row['ver'] == $row['ver'] ? ' selected="selected"' : '' ?>>Version <?=$row['ver']?></option>
การใช้ OO ที่ทันสมัยฉันสามารถวางการเข้าถึงข้อมูลในไฟล์ของตัวเองโดยใช้รูปแบบ Repository, โค้ดการดูสามารถเข้าไปในเทมเพลตไฟล์ของตัวเองและฉันสามารถเชื่อมโยงข้อมูลเหล่านั้นเข้าด้วยกันเพื่อสื่อสารผ่านตัวควบคุม (หรือ Action หรือ Request Handler) เพิ่มโรงงานเพื่อสร้างและวางสายการพึ่งพาต่างๆ และฉันสามารถมีไฟล์กำหนดค่าที่กำหนดโรงงานเหล่านั้น แน่นอนมันเป็นขั้นตอนจากไฟล์เดียวทุกอย่าง
คำถามของฉันเกี่ยวกับการแยกข้อกังวลเป็นเช่นนั้น: การอ่านคำพูดของ Dijkstra ฉันมีความคิดว่าบางทีเขาอาจไม่จำเป็นต้องแยกความกังวลออกเป็น "การแยกแบบแยกส่วนของรหัส (เป็นไฟล์หรือฟังก์ชั่น / วิธี / ฯลฯ )" และเขาตั้งใจจะมุ่งความสนใจไปที่แง่มุมของรายการโดยไม่ทำให้ตัวเองต้องกังวลกับสิ่งสำคัญอื่น ๆ ที่ยังไม่ได้รับการพิจารณาในปัจจุบันโดยไม่คำนึงว่าพวกเขาแยกจากกันในรหัสหรือไม่
เหตุใดเราจึงสร้างภาระให้เราด้วยการแยกรหัสแบบแยกส่วนและรูปแบบการออกแบบทางกายภาพ? มันจะไม่เพียงพอที่จะเพียงแค่มุ่งเน้นไปที่แง่มุมโดยไม่คำนึงถึงวิธีการที่รหัสของคุณมีโครงสร้าง?
ฉันไม่ได้พูดถึงการเขียนรหัสสปาเก็ตตี้ที่น่ากลัวที่สุดจากนั้นพิจารณาเฉพาะแง่มุมของมันเท่านั้นซึ่งน่าจะเป็นภาระ แต่ในท้ายที่สุดสิ่งที่ฉันกำลังทำคือทำไมทำแยกรหัสทางกายภาพทำไมแบ่งรหัสออกเป็นไฟล์หรือชิ้นส่วนที่แยกต่างหาก (วิธีการ) เมื่อมันไม่จำเป็นสำหรับจิตใจมุ่งเน้นตัวเองในแง่มุม?
ควรแยกความกังวลยังคงออกกำลังกายจิตมากกว่าทางกายภาพหรือไม่
กล่าวอีกนัยหนึ่งควรจะมีการตัดการเชื่อมต่อระหว่างด้านจิตใจ (มุ่งเน้น) และด้านกายภาพ (รหัสบนกระดาษ) ด้านการเขียนโปรแกรม?
IF
, WHILE
, แทนFOR
GOTO
Modular = modules ที่มี API สาธารณะที่กำหนดชัดเจนแยกจากการใช้และการนำเสนอภายในที่ซ่อนอยู่อย่างเคร่งครัด (เช่น Modula, Mesa, Modula-2, Modula-3, ภาษา Pascal ต่อมา ( UNIT
))