10 หลักการเขียนโปรแกรมเชิงวัตถุที่นักพัฒนาทุกคนควรรู้

10 หลักการเขียนโปรแกรมเชิงวัตถุที่นักพัฒนาทุกคนควรรู้

บ่อยครั้งที่ฉันพบกับนักพัฒนาที่ไม่เคยได้ยินเกี่ยวกับหลักการของ SOLID (เรา พูดคุยเกี่ยวกับพวกเขาโดยละเอียดที่นี่. - การแปล) หรือการเขียนโปรแกรมเชิงวัตถุ (OOP) หรือได้ยิน แต่อย่านำไปใช้ในทางปฏิบัติ บทความนี้จะอธิบายประโยชน์ของหลักการ OOP ที่ช่วยนักพัฒนาในการทำงานประจำวันของเขา บางคนเป็นที่รู้จักกันดี แต่บางคนก็ไม่มากนักดังนั้นบทความนี้จะมีประโยชน์สำหรับทั้งผู้เริ่มต้นและโปรแกรมเมอร์ที่มีประสบการณ์แล้ว

เราเตือนคุณ: สำหรับผู้อ่าน "Habr" ทุกคน - ส่วนลด 10 รูเบิล เมื่อลงทะเบียนในหลักสูตร Skillbox ใด ๆ โดยใช้รหัสส่งเสริมการขาย "Habr"

Skillbox แนะนำ: หลักสูตรออนไลน์เพื่อการศึกษา “นักพัฒนาจาวา”.

แห้ง (อย่าทำซ้ำตัวเอง)

หลักการที่ค่อนข้างง่ายซึ่งมีสาระสำคัญที่ชัดเจนจากชื่อ: "อย่าพูดซ้ำ" สำหรับโปรแกรมเมอร์ นี่หมายถึงความจำเป็นในการหลีกเลี่ยงโค้ดที่ซ้ำกัน รวมถึงความสามารถในการใช้นามธรรมในการทำงาน

หากมีสองส่วนที่ซ้ำกันในโค้ด ควรรวมเข้าด้วยกันเป็นวิธีเดียว หากมีการใช้ค่าฮาร์ดโค้ดมากกว่าหนึ่งครั้ง จะคุ้มค่าที่จะแปลงค่าดังกล่าวเป็นค่าคงที่สาธารณะ

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

เปลี่ยนการห่อหุ้ม

ผลิตภัณฑ์ซอฟต์แวร์ของบริษัทส่วนใหญ่มีการพัฒนาอย่างต่อเนื่อง ซึ่งหมายความว่าจำเป็นต้องเปลี่ยนรหัสและจำเป็นต้องดูแลรักษา คุณสามารถทำให้ชีวิตของคุณง่ายขึ้นด้วยการห่อหุ้ม สิ่งนี้จะช่วยให้คุณสามารถทดสอบและรักษาฐานโค้ดที่มีอยู่ได้อย่างมีประสิทธิภาพมากขึ้น นี่คือตัวอย่างหนึ่ง.

หากคุณกำลังเขียนด้วยภาษาจาวาแล้ว กำหนดไพรเวตให้กับเมธอดและตัวแปรตามค่าเริ่มต้น.

หลักการของการเปิดกว้าง/ความใกล้ชิด

หลักการนี้สามารถจดจำได้ง่ายโดยการอ่านข้อความต่อไปนี้: "เอนทิตีซอฟต์แวร์ (คลาส โมดูล ฟังก์ชัน ฯลฯ) ควรเปิดเพื่อขยาย แต่ปิดเพื่อแก้ไข" ในทางปฏิบัติ หมายความว่าพวกเขาสามารถยอมให้พฤติกรรมเปลี่ยนแปลงได้โดยไม่ต้องเปลี่ยนซอร์สโค้ด

หลักการนี้มีความสำคัญเมื่อการเปลี่ยนแปลงซอร์สโค้ดจำเป็นต้องมีการแก้ไข การทดสอบหน่วย และขั้นตอนอื่นๆ รหัสที่เป็นไปตามหลักการเปิด/ปิดจะไม่เปลี่ยนแปลงเมื่อขยายออกไป ดังนั้นจึงมีปัญหาน้อยลงมาก

นี่คือตัวอย่างโค้ดที่ละเมิดหลักการนี้

10 หลักการเขียนโปรแกรมเชิงวัตถุที่นักพัฒนาทุกคนควรรู้

หากคุณต้องการเปลี่ยนแปลงบางสิ่งในนั้นจะใช้เวลานานเพราะคุณจะต้องเปลี่ยนทุกส่วนของโค้ดที่เกี่ยวข้องกับส่วนที่ต้องการ

อย่างไรก็ตาม การเปิดกว้าง-ปิดเป็นหนึ่งในหลักการของ SOLID

หลักการความรับผิดชอบเดียว (SRP)

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

10 หลักการเขียนโปรแกรมเชิงวัตถุที่นักพัฒนาทุกคนควรรู้

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

หลักการผกผันการพึ่งพา (DIP)

10 หลักการเขียนโปรแกรมเชิงวัตถุที่นักพัฒนาทุกคนควรรู้

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

ปัญหาสามารถแก้ไขได้ด้วยกรมทรัพย์สินทางปัญญา ดังนั้น แทนที่จะเป็น AppManager เราขอ EventLogWriter ซึ่งจะถูกฉีดโดยใช้เฟรมเวิร์ก

DIP ช่วยให้สามารถแทนที่แต่ละโมดูลด้วยโมดูลอื่นๆ ได้อย่างง่ายดายโดยการเปลี่ยนโมดูลการพึ่งพา ทำให้สามารถเปลี่ยนโมดูลหนึ่งได้โดยไม่ส่งผลกระทบต่อโมดูลอื่นๆ

องค์ประกอบแทนการสืบทอด

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

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

แม้แต่ "Effective Java" Joshua Bloch ยังแนะนำให้เลือกใช้การเรียบเรียงมากกว่าการสืบทอด

หลักการทดแทนบาร์บารา ลิสคอฟ (LSP)

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

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

นี่คือโค้ดส่วนหนึ่งที่ขัดแย้งกับ LSP

10 หลักการเขียนโปรแกรมเชิงวัตถุที่นักพัฒนาทุกคนควรรู้

วิธีพื้นที่(Rectangle r) คำนวณพื้นที่ของสี่เหลี่ยมผืนผ้า โปรแกรมจะล่มหลังจากรัน Square เนื่องจาก Square ไม่ใช่รูปสี่เหลี่ยมผืนผ้าที่นี่ ตามหลักการ LSP ฟังก์ชันที่ใช้การอ้างอิงถึงคลาสพื้นฐานควรจะสามารถใช้อ็อบเจ็กต์ของคลาสที่ได้รับโดยไม่มีคำแนะนำเพิ่มเติม

หลักการนี้ ซึ่งเป็นคำจำกัดความเฉพาะของประเภทย่อย ได้รับการเสนอโดย Barbara Liskov ในประเด็นสำคัญในการประชุมปี 1987 ที่เรียกว่า "Data Abstraction and Hierarchy" - จึงเป็นที่มาของชื่อ

หลักการแยกอินเทอร์เฟซ (ISP)

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

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

เนื่องจากการเขียนอินเทอร์เฟซเป็นงานที่ซับซ้อน หลังจากงานเสร็จสิ้น การเปลี่ยนแปลงโดยไม่ทำลายสิ่งใดๆ จะเป็นปัญหาได้

ข้อดีของหลักการ ISP ใน Java คือต้องนำเมธอดทั้งหมดไปใช้ก่อน และจากนั้นจึงจะใช้ได้กับคลาสเท่านั้น ดังนั้นหลักการจึงทำให้สามารถลดจำนวนวิธีการลงได้

10 หลักการเขียนโปรแกรมเชิงวัตถุที่นักพัฒนาทุกคนควรรู้

การเขียนโปรแกรมสำหรับอินเทอร์เฟซ ไม่ใช่การใช้งาน

ที่นี่ทุกอย่างชัดเจนจากชื่อ การใช้หลักการนี้นำไปสู่โค้ดที่ยืดหยุ่นซึ่งสามารถทำงานร่วมกับการใช้งานอินเทอร์เฟซใหม่ได้

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

นั่นคือ:

รายการตัวเลข= getNumbers();

แต่ไม่:

หมายเลข ArrayList = getNumbers();

นี่คือการนำไปปฏิบัติจริงของสิ่งที่กล่าวไว้ข้างต้น

10 หลักการเขียนโปรแกรมเชิงวัตถุที่นักพัฒนาทุกคนควรรู้

หลักการมอบหมาย

ตัวอย่างทั่วไปคือวิธีการเท่ากับ() และ hashCode() ใน Java เมื่อจำเป็นต้องเปรียบเทียบสองวัตถุ การดำเนินการนี้จะถูกมอบหมายให้กับคลาสที่เหมาะสมแทนคลาสไคลเอนต์

ข้อดีของหลักการคือไม่มีโค้ดซ้ำซ้อนและเปลี่ยนพฤติกรรมได้ง่าย นอกจากนี้ยังใช้กับการมอบหมายกิจกรรมด้วย

10 หลักการเขียนโปรแกรมเชิงวัตถุที่นักพัฒนาทุกคนควรรู้

หลักการทั้งหมดนี้ช่วยให้คุณสามารถเขียนโค้ดที่ยืดหยุ่น สวยงาม และเชื่อถือได้มากขึ้น โดยมีความสอดคล้องกันสูงและมีการมีเพศสัมพันธ์ต่ำ แน่นอนว่าทฤษฎีเป็นสิ่งที่ดี แต่สำหรับนักพัฒนาที่จะเริ่มใช้ความรู้ที่ได้รับอย่างแท้จริง จำเป็นต้องมีการฝึกฝน ขั้นตอนต่อไปหลังจากเชี่ยวชาญหลักการของ OOP แล้วคือการศึกษารูปแบบการออกแบบเพื่อแก้ไขปัญหาการพัฒนาซอฟต์แวร์ทั่วไป

Skillbox แนะนำ:

ที่มา: will.com

เพิ่มความคิดเห็น