สถาปัตยกรรมซอฟต์แวร์คือการประดิษฐ์ภาษา
กับทุกเลเยอร์ซอฟต์แวร์คุณสร้างภาษาที่คุณ (หรือเพื่อนร่วมงานของคุณ) ต้องการแสดงโซลูชันเลเยอร์ถัดไปที่สูงกว่าใน (ดังนั้นฉันจะใส่ภาษาอะนาล็อกภาษาธรรมชาติในโพสต์ของฉัน) ผู้ใช้ของคุณไม่ต้องการใช้เวลาหลายปีในการเรียนรู้วิธีการอ่านหรือเขียนภาษานั้น
มุมมองนี้ช่วยฉันเมื่อตัดสินใจเลือกประเด็นทางสถาปัตยกรรม
การอ่าน
ภาษานั้นควรเข้าใจได้ง่าย (ทำให้สามารถอ่านโค้ดเลเยอร์ถัดไปได้) รหัสอ่านบ่อยกว่าที่เขียน
หนึ่งแนวคิดควรแสดงด้วยคำเดียว - หนึ่งคลาสหรืออินเทอร์เฟซควรแสดงแนวคิด (โดยทั่วไปแล้วภาษาสลาฟมีสองคำที่แตกต่างกันสำหรับคำกริยาภาษาอังกฤษหนึ่งดังนั้นคุณต้องเรียนรู้คำศัพท์สองครั้งภาษาธรรมชาติทั้งหมดใช้คำเดียวสำหรับแนวคิดที่หลากหลาย)
แนวคิดที่คุณเปิดเผยไม่ควรมีเรื่องที่น่าประหลาดใจ นั่นคือการตั้งชื่อแบบแผนส่วนใหญ่เช่น get- และ set-methods เป็นต้นและรูปแบบการออกแบบสามารถช่วยได้เพราะมันมีรูปแบบการแก้ปัญหามาตรฐานและผู้อ่านเห็นว่า "ตกลงฉันได้รับวัตถุจากโรงงาน" และรู้ว่ามันหมายถึงอะไร แต่ถ้าเพียงยกตัวอย่างชั้นเรียนที่เป็นรูปธรรมก็สามารถทำได้
การใช้งาน
ภาษาควรใช้งานง่าย (ทำให้ง่ายต่อการกำหนด "ประโยคที่ถูกต้อง")
หากคลาส / อินเตอร์เฟส MemCache เหล่านี้ปรากฏขึ้นในเลเยอร์ถัดไปนั่นจะสร้างเส้นโค้งการเรียนรู้ที่สูงชันสำหรับผู้ใช้จนกว่าเขาจะเข้าใจเวลาและสถานที่ที่จะใช้คำใดของคำเหล่านี้สำหรับแนวคิดเดียวของแคช
การเปิดเผยเฉพาะคลาส / วิธีการที่จำเป็นทำให้ผู้ใช้ของคุณค้นพบสิ่งที่เขาต้องการได้ง่ายขึ้น (ดูเอกสาร DocBrowns ของ Antoine de Saint-Exupery) การเปิดเผยอินเตอร์เฟสแทนการใช้คลาสสามารถทำให้ง่ายขึ้น
หากคุณเปิดเผยฟังก์ชั่นที่สามารถใช้รูปแบบการออกแบบที่กำหนดขึ้นได้ดีกว่าที่จะติดตามรูปแบบการออกแบบนั้นดีกว่าการประดิษฐ์สิ่งที่แตกต่างออกไป ผู้ใช้ของคุณจะเข้าใจ APIs ตามรูปแบบการออกแบบได้ง่ายกว่าแนวคิดที่แตกต่างกันโดยสิ้นเชิง (ถ้าคุณรู้ว่าอิตาลีสเปนจะง่ายกว่าคุณจีน)
สรุป
แนะนำ abstractions หากทำให้การใช้งานง่ายขึ้น (และคุ้มค่ากับค่าใช้จ่ายในการบำรุงรักษาทั้งนามธรรมและการนำไปใช้)
หากรหัสของคุณมีภารกิจย่อย (ไม่สำคัญ) ให้แก้ไข "วิธีที่คาดหวัง" เช่นทำตามรูปแบบการออกแบบที่เหมาะสมแทนการประดิษฐ์ล้อชนิดต่าง ๆ อีกครั้ง