Try using it in your preferred language.

English

  • English
  • 汉语
  • Español
  • Bahasa Indonesia
  • Português
  • Русский
  • 日本語
  • 한국어
  • Deutsch
  • Français
  • Italiano
  • Türkçe
  • Tiếng Việt
  • ไทย
  • Polski
  • Nederlands
  • हिन्दी
  • Magyar
translation

นี่คือโพสต์ที่แปลด้วย AI

제이온

[อ็อบเจ็กต์] บทที่ 1. อ็อบเจ็กต์ การออกแบบ

เลือกภาษา

  • ไทย
  • English
  • 汉语
  • Español
  • Bahasa Indonesia
  • Português
  • Русский
  • 日本語
  • 한국어
  • Deutsch
  • Français
  • Italiano
  • Türkçe
  • Tiếng Việt
  • Polski
  • Nederlands
  • हिन्दी
  • Magyar

สรุปโดย AI ของ durumis

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

บทนำ

โรเบิร์ต แอล. กลัส อ้างว่าการปฏิบัติจริงสำคัญกว่าทฤษฎี โดยเฉพาะอย่างยิ่งในด้านการพัฒนาซอฟต์แวร์ การปฏิบัติจริงนำหน้าทฤษฎีเป็นสาขาที่เป็นตัวแทน และนักพัฒนาจะได้รับประโยชน์มากที่สุดเมื่อ พวกเขาเริ่มสัมผัสกับรหัสจริง ดังนั้นเราจะละทิ้งทฤษฎีและแนวคิดไปก่อน และสำรวจโปรแกรม ง่ายๆ ร่วมกัน


การนำแอปพลิเคชันจำหน่ายตั๋วไปใช้งาน

  • เรากำลังวางแผนจัดงานเล็กๆ เพื่อโปรโมตโรงละครขนาดเล็ก
    • เนื้อหาของงาน: ส่งบัตรเชิญให้กับผู้ชมที่ได้รับเลือกโดยการจับฉลาก เพื่อให้พวกเขาสามารถรับชมการแสดงได้ฟรี
  • เราจำเป็นต้องแยกผู้ชมที่ได้รับรางวัลจากผู้ชมที่ไม่ได้รับรางวัล
    • ผู้ชมที่ได้รับรางวัล: แลกบัตรเชิญเป็นตั๋ว
    • ผู้ชมที่ไม่ได้รับรางวัล: ซื้อตั๋วด้วยเงินสด



ปัญหาคืออะไร

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


  • ทำงานได้อย่างถูกต้องในขณะที่กำลังดำเนินการ
  • มีอยู่เพื่อเปลี่ยนแปลง
    • ควรสามารถเปลี่ยนแปลงได้ด้วยการทำงานที่ง่าย
  • สื่อสารกับคนที่อ่านรหัส
    • นักพัฒนาควรอ่านและเข้าใจได้ง่าย


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


รหัสที่นอกเหนือความคาดหมาย

ลองมาดูสาเหตุที่ไม่ตรงตามวัตถุประสงค์ของการสื่อสารกัน


  • สิ่งที่เมธอด enter() ของคลาส Theater ทำ
    • โรงละครจะเปิดกระเป๋าของผู้ชมเพื่อตรวจสอบว่ามีบัตรเชิญอยู่ข้างในหรือไม่
    • ถ้ามีบัตรเชิญอยู่ข้างใน กระเป๋า โรงละครจะสั่งให้พนักงานขายย้ายตั๋วที่เก็บไว้ในตู้ขายตั๋ว ไปไว้ในกระเป๋าของผู้ชม
    • ถ้าไม่มีบัตรเชิญอยู่ข้างใน กระเป๋า โรงละครจะนำเงินสดออกจากกระเป๋าของผู้ชม เท่ากับราคาตั๋ว ซื้อตั๋ว และใส่ตั๋วไว้ในกระเป๋า
  • จากมุมมองของผู้ชม โรงละครซึ่งเป็นบุคคลที่สามจะต้องเปิดกระเป๋าของพวกเขา และนำเงินไปด้วยตนเอง และใส่ตั๋วไว้ในกระเป๋าของพวกเขา
  • จากมุมมองของพนักงานขาย โรงละครซึ่งเป็นบุคคลที่สามจะต้องดูแลตู้ขายตั๋ว ของพวกเขาโดยไม่ขออนุญาต และจัดการกับเงินสดและตั๋ว
  • รหัสที่เข้าใจได้หมายถึงรหัสที่ทำงานไม่นอกเหนือความคาดหวังของเรา และโรงละครนี้ก็ออกนอกความคาดหมายของเรา
    • ผู้ชมควรนำเงินสดออกจากกระเป๋าของตนเองเพื่อชำระเงิน และรับตั๋วจากพนักงานขาย
    • พนักงานขายควรนำตั๋วออกจากตู้ขายตั๋วด้วยตัวเอง ส่งให้กับผู้ชม และรับเงินสดจากผู้ชมเพื่อเก็บไว้ในตู้ขายตั๋ว
  • นอกจากนี้ เพื่อให้เข้าใจเมธอด enter() เราจำเป็นต้องจำรายละเอียดต่างๆ ทั้งหมดด้วย
    • Audience มี Bag
    • Bag มีเงินสดและตั๋ว
    • TiketSellet ขายตั๋วจาก TicketOffice และ TicketOffice มีเงินสด และตั๋วเก็บไว้


รหัสที่อ่อนไหวต่อการเปลี่ยนแปลง

เมธอด enter() มีสองเงื่อนไข

  • ผู้ชมจะพกกระเป๋าติดตัวไปเสมอเพื่อเก็บเงินสดและบัตรเชิญ
  • พนักงานขายขายตั๋วจากตู้ขายตั๋วเท่านั้น


แล้วสถานการณ์ต่อไปนี้จะเป็นอย่างไร

  • ผู้ชมอาจไม่มีกระเป๋า
  • ผู้ชมอาจใช้บัตรเครดิตแทนเงินสด
  • พนักงานขายอาจขายตั๋วจากนอกตู้ขายตั๋ว


ตัวอย่างเช่น เพื่อให้ตรงตามข้อกำหนดแรก เราจำเป็นต้องลบออบเจ็กต์ Bag ของ Audience และแก้ไขเมธอด enter() ของคลาส Theater นี่เป็นเพราะคลาส Theater ขึ้นอยู่กับ ความจริงที่ละเอียดมากเกินไปว่าผู้ชมมีกระเป๋าและพนักงานขายขายตั๋วจากตู้ขายตั๋วเท่านั้น ถ้าความจริงที่ละเอียดมากเกินไปเหล่านี้เปลี่ยนแปลง เราจะต้องแก้ไขทั้งคลาสนี้ และคลาสที่ขึ้นอยู่กับมัน (เช่น Theater)


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


กรณีที่ออบเจ็กต์พึ่งพากันมากเกินไป เรียกว่าการผูกมัดสูง และยิ่งการผูกมัดระหว่างสองออบเจ็กต์สูงเท่าใด ความน่าจะเป็นที่จะ เปลี่ยนแปลงร่วมกันก็จะยิ่งสูงขึ้นเท่านั้น ดังนั้นเป้าหมายของการออกแบบจึง คือการลดการผูกมัดระหว่างออบเจ็กต์เพื่อให้การออกแบบสามารถเปลี่ยนแปลงได้ง่าย


ปรับปรุงการออกแบบ

Theater ไม่จำเป็นต้องรู้ว่าผู้ชมมีกระเป๋าและพนักงานขายขายตั๋วจากตู้ขายตั๋ว Theater ต้องการเพียงให้ผู้ชมเข้าโรงละคร ดังนั้นเราจึงต้องสร้างผู้ชมที่เป็น หน่วยงานที่เป็นอิสระ ซึ่งสามารถจัดการกับเงินสดและบัตรเชิญในกระเป๋าของตนเองได้ และสร้างพนักงานขายที่เป็นหน่วยงานที่เป็นอิสระ ซึ่งสามารถจัดการกับตั๋วและค่าตั๋ว ในตู้ขายตั๋วของตนเองได้


เพิ่มระดับความเป็นอิสระ

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


การเขียนโปรแกรมเชิงกระบวนการและเชิงวัตถุ

  • เชิงกระบวนการ
    • เมธอด enter() ของ Theater เป็นกระบวนการ และ Audience, TicketSeller, Bag, TicketOffice เป็นข้อมูล
    • การเขียนโปรแกรมเชิงกระบวนการเป็นวิธีการวางกระบวนการและข้อมูล ไว้ในโมดูลที่แยกต่างหาก
    • มีรหัสจำนวนมากที่ขัดต่อสัญชาตญาณของเรา (เช่น ผู้ชมจัดการเงิน และบัตรเชิญด้วยตัวเอง)
    • เป็นการยากที่จะจำกัดผลกระทบจากการเปลี่ยนแปลงข้อมูล
    • การจัดการความรับผิดชอบแบบรวมศูนย์ (Theater จัดการทุกอย่าง)
  • เชิงวัตถุ
    • การเขียนโปรแกรมเชิงวัตถุเป็นวิธีการวางข้อมูลและกระบวนการไว้ ในโมดูลเดียวกัน
    • เราสามารถเขียนรหัสที่ตรงกับสัญชาตญาณของเรา
    • เราสามารถจำกัดผลกระทบจากการเปลี่ยนแปลงข้อมูลได้อย่างมีประสิทธิภาพ ผ่านการแคปซูล
    • แต่ละออบเจ็กต์รับผิดชอบต่อตัวเอง


สามารถปรับปรุงได้อีก

  • คลาส Bag ของคลาส Audience ยังคงเป็นหน่วยงานที่ไม่เป็นอิสระ ที่ถูกควบคุมโดยคลาส Audience ดังนั้นเราจึงต้องสร้างคลาส Bag เป็นออบเจ็กต์ที่เป็นอิสระ
  • TicketOffice ของคลาส TicketSeller ถูกควบคุมโดย TicketSeller ด้วย ดังนั้นเราจึงต้องสร้าง TicketOffice เป็นออบเจ็กต์ที่เป็นอิสระ
    • อย่างไรก็ตาม หลังจากเปลี่ยนแปลงแล้ว TicketOffice จะมีการผูกมัดเพิ่มเติมกับ Audience
    • การออกแบบต้องมีการพิจารณา trade-off อย่างรอบคอบ ในกรณีนี้ เราสามารถตัดสินใจที่จะสร้าง TicketOffice เป็นออบเจ็กต์ที่ไม่เป็นอิสระในระดับหนึ่งเพื่อลดการผูกมัด กับ Audience



ใช่แล้ว มันเป็นเรื่องโกหก!

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


การออกแบบเชิงวัตถุ

เหตุใดการออกแบบจึงจำเป็น

  • การออกแบบคือการวางรหัส
  • การออกแบบที่ดีคือการออกแบบที่สามารถตอบสนองความต้องการในวันนี้ ได้อย่างสมบูรณ์แบบและรองรับการเปลี่ยนแปลงในอนาคตได้อย่างราบรื่น


การออกแบบเชิงวัตถุ

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


แหล่งที่มา

  • ออบเจ็กต์
제이온
제이온
제이온
제이온
[วัตถุ] บทที่ 2. การเขียนโปรแกรมเชิงวัตถุ เอกสารนี้เป็นการอธิบายวิธีการเขียนโปรแกรมเชิงวัตถุเพื่อการใช้งานระบบจองตั๋วภาพยนตร์ โดยครอบคลุมแนวคิดต่างๆ เช่น การทำงานร่วมกัน วัตถุ คลาส การสืบทอด การพหุรูปลักษณะ การนามธรรม การประพันธ์ เป็นต้น นอกจากนี้ยังแสดงวิธีการรักษาความเป็นอิสระของวัตถุผ่านการห่อ

28 เมษายน 2567

[Effective Java] รายการ 6. หลีกเลี่ยงการสร้างอ็อบเจ็กต์ที่ไม่จำเป็น คู่มือเกี่ยวกับวิธีลดการสร้างอ็อบเจ็กต์ที่ไม่จำเป็นใน Java อ็อบเจ็กต์แบบไม่เปลี่ยนแปลง เช่น String, Boolean ควรใช้ลิเทอรัล และควรแคชอินสแตนซ์ Pattern สำหรับนิพจน์ทั่วไป นอกจากนี้ การออโต้บอกซ์อาจทำให้ประสิทธิภาพลดลง ดังนั้นจึงควรใช้ประเภทพื้นฐาน รายละเอีย

28 เมษายน 2567

[Effective Java] รายการ 5: ใช้การฉีดการพึ่งพาแทนการระบุทรัพยากร หากคลาสพึ่งพาทรัพยากรภายนอก การใช้ซิงเกิลตันและคลาสยูทิลิตี้แบบคงที่ไม่ใช่ความคิดที่ดี การฉีดการพึ่งพาช่วยปรับปรุงความยืดหยุ่น การนำกลับมาใช้ใหม่และความสะดวกในการทดสอบของคลาส และการใช้รูปแบบวิธีการของโรงงานทำให้การฉีดการพึ่งพา มีประสิทธิภาพมากขึ้น

28 เมษายน 2567

[ไม่มีพื้นฐานทางวิศวกรรมคอมพิวเตอร์ การอยู่รอดในฐานะนักพัฒนา] 14. สรุปเนื้อหาการสัมภาษณ์ทางเทคนิคที่นักพัฒนาหน้าใหม่ถามบ่อย คู่มือเตรียมตัวสัมภาษณ์งานเทคนิคสำหรับนักพัฒนาหน้าใหม่ บทความนี้จะอธิบายแนวคิดที่มักปรากฏใน การสัมภาษณ์งาน เช่น พื้นที่หน่วยความจำหลัก โครงสร้างข้อมูล RDBMS และ NoSQL การเขียนโปรแกรมเชิงโครงสร้างและเชิงวัตถุ การโอเวอร์ไรด์และการโอเวอร์โหลด อัลกอริทึมการเป
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자

3 เมษายน 2567

เมืองไม่ใช่แอป (App) -1 รถสกูตเตอร์ไฟฟ้า เหมือนกับเวโลซีแรปเตอร์ ที่ปรากฏตัวในเมือง จะพิชิตเมืองได้หรือไม่? บริษัทที่ร้องตะโกนว่านวัตกรรม มองเมืองเป็นผืนผ้าใบเปล่า แต่เมืองเป็นสิ่งมีชีวิตที่ซับซ้อน และเป็นพื้นที่ที่มีชีวิตและวัฒนธรรมของผู้คน หากต้องการสร้างนวัตกรรม อย่างแท้จริง
Byungchae Ryan Son
Byungchae Ryan Son
Byungchae Ryan Son
Byungchae Ryan Son
Byungchae Ryan Son

9 พฤษภาคม 2567

การสร้างแบบจำลองข้อมูลเชิงตรรกะ การสร้างแบบจำลองข้อมูลเชิงตรรกะคือกระบวนการแปลงแบบจำลองข้อมูลเชิงแนวคิดให้สอดคล้องกับรูปแบบฐานข้อมูลเชิงสัมพันธ์ โดยใช้กฎการแมป ซึ่งเกี่ยวข้องกับ การจัดการความสัมพันธ์ 1:1, 1:N, N:M และการทำให้เป็นปกติเพื่อให้ได้มาซึ่งความสมบูรณ์ของข้อมูล 1NF, 2NF, 3NF ผ่
제이의 블로그
제이의 블로그
제이의 블로그
제이의 블로그
제이의 블로그

9 เมษายน 2567

ความคิดของฉันเป็นอย่างไร? ความหมายของความคิดไม่ใช่แค่ความคิดสร้างสรรค์ แต่ขึ้นอยู่กับว่ามันส่งผลกระทบต่อชีวิตประจำวันของผู้อื่นและสามารถสื่อความหมายได้อย่างไร จากมุมมองทางปรัชญาของไฮเดกเกอร์ เราสามารถทบทวนคุณค่าและความหมายที่แท้จริงของความคิดและสำรวจวิธีการสร้างความคิดที่ตอบสนองต่
Byungchae Ryan Son
Byungchae Ryan Son
Byungchae Ryan Son
Byungchae Ryan Son
Byungchae Ryan Son

7 พฤษภาคม 2567

แบบจำลองข้อมูลตรรกะของโครงการ Kanban Board 2 บทความนี้อธิบายวิธีการสร้างแบบจำลองข้อมูลตรรกะโดยใช้ ERD แบบจำลองข้อมูลเชิงแนวคิดเป็นพื้นฐาน พร้อมทั้งอธิบายขั้นตอนต่างๆ ของการดำเนินการและแสดงวิธีแก้ปัญหาที่อาจเกิดขึ้นในระหว่างการทำให้เป็นปกติ โดยเฉพาะอย่างยิ่งจะมุ่งเน้นไปที่การแก้ไขปัญหาเกี่ยวกับความจำ
제이의 블로그
제이의 블로그
제이의 블로그
제이의 블로그
제이의 블로그

9 เมษายน 2567

มนุษย์เป็นปรากฏการณ์ มาตรฐานการตัดสินใจขององค์กร -2 นำเสนอแนวทางการเข้าใกล้ที่เน้นปรากฏการณ์โดยใช้พฤติกรรมของมนุษย์เป็นเกณฑ์ในการตัดสินใจขององค์กร แนวทางนี้ช่วยให้เข้าใจความต้องการและแรงจูงใจของลูกค้า และค้นพบโอกาสการเติบโตที่แตกต่าง การแก้ปัญหาแบบอนุมานโดยเฉพาะและวิธีการรวบรวมข้อมูลที่หลากหลายช่วยให้ได้ข้
Byungchae Ryan Son
Byungchae Ryan Son
Byungchae Ryan Son
Byungchae Ryan Son
Byungchae Ryan Son

7 พฤษภาคม 2567