คำถามติดแท็ก object-oriented

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

10
เราควรหลีกเลี่ยงวัตถุที่กำหนดเองเป็นพารามิเตอร์?
สมมติว่าฉันมีวัตถุที่กำหนดเองนักเรียน : public class Student{ public int _id; public String name; public int age; public float score; } และคลาส, หน้าต่างที่ใช้เพื่อแสดงข้อมูลของนักเรียน : public class Window{ public void showInfo(Student student); } มันดูค่อนข้างปกติ แต่ฉันพบว่าWindowนั้นไม่ง่ายที่จะทำการทดสอบเป็นรายบุคคลเพราะมันต้องการออบเจ็กต์Studentจริงเพื่อเรียกใช้ฟังก์ชัน ดังนั้นฉันจึงพยายามปรับเปลี่ยน showInfo เพื่อที่จะไม่ยอมรับวัตถุนักเรียนโดยตรง: public void showInfo(int _id, String name, int age, float score); เพื่อให้ง่ายต่อการทดสอบหน้าต่างแยกต่างหาก: showInfo(123, "abc", 45, 6.7); แต่ฉันพบว่าเวอร์ชันที่แก้ไขมีปัญหาอื่น: …

9
คำอธิบายเกี่ยวกับวิธี“ บอกอย่าถาม” ถือว่าเป็น OO ที่ดี
บล็อกโพสต์นี้ถูกโพสต์ใน Hacker News พร้อมอัปโหลดหลายรายการ มาจาก C ++ ตัวอย่างเหล่านี้ส่วนใหญ่ดูเหมือนจะขัดแย้งกับสิ่งที่ฉันได้รับการสอน เช่นตัวอย่าง # 2: แย่: def check_for_overheating(system_monitor) if system_monitor.temperature > 100 system_monitor.sound_alarms end end เมื่อเทียบกับดี: system_monitor.check_for_overheating class SystemMonitor def check_for_overheating if temperature > 100 sound_alarms end end end คำแนะนำใน C ++ คือคุณควรชอบฟังก์ชั่นฟรีแทนฟังก์ชั่นสมาชิกที่เพิ่มการห่อหุ้ม ทั้งสองอย่างนี้มีความหมายเหมือนกันดังนั้นเหตุใดจึงเลือกตัวเลือกที่มีการเข้าถึงสถานะเพิ่มเติม ตัวอย่างที่ 4: แย่: def street_name(user) if user.address user.address.street_name else 'No …

8
LSP เทียบกับการทดแทน OCP / Liskov VS เปิดปิด
ฉันพยายามที่จะเข้าใจหลักการของ OOP และฉันได้ข้อสรุปว่า LSP และ OCP มีความคล้ายคลึงกัน (ถ้าไม่พูดมากกว่านี้) หลักการเปิด / ปิดระบุ "เอนทิตีของซอฟต์แวร์ (คลาส, โมดูล, ฟังก์ชั่น, อื่น ๆ ) ควรจะเปิดสำหรับการขยาย แต่ปิดสำหรับการปรับเปลี่ยน" ในคำง่ายๆ LSP ระบุว่าอินสแตนซ์ใด ๆ ของFooสามารถถูกแทนที่ด้วยอินสแตนซ์ใด ๆBarที่ได้มาจากFooและโปรแกรมจะทำงานในลักษณะเดียวกัน ฉันไม่ใช่โปรแกรมเมอร์ OOP มืออาชีพ แต่สำหรับฉันแล้วดูเหมือนว่า LSP จะเป็นไปได้ก็ต่อเมื่อBarได้รับมาจากFooไม่ได้เปลี่ยนแปลงอะไรเลย แต่จะขยายออกไปเท่านั้น นั่นหมายความว่าโดยเฉพาะอย่างยิ่งโปรแกรม LSP จะเป็นจริงเฉพาะเมื่อ OCP เป็นจริงและ OCP เป็นจริงเฉพาะในกรณีที่ LSP เป็นจริง นั่นหมายความว่าพวกเขาเท่าเทียมกัน ช่วยแก้ให้ด้วยนะถ้าฉันผิด. ฉันต้องการเข้าใจแนวคิดเหล่านี้จริงๆ ขอบคุณมากสำหรับคำตอบ

3
วิธีใดเป็นวิธีปฏิบัติที่ดีกว่าสำหรับตัวอย่างหรือแบบสถิต?
คำถามนี้เป็นเรื่องส่วนตัว แต่ฉันแค่อยากรู้ว่าโปรแกรมเมอร์ส่วนใหญ่เข้าหานี้อย่างไร ตัวอย่างด้านล่างเป็นแบบหลอก -C # แต่ควรใช้กับ Java, C ++ และภาษา OOP อื่น ๆ ด้วย อย่างไรก็ตามเมื่อเขียนวิธีการช่วยเหลือในชั้นเรียนของฉันฉันมักจะประกาศให้พวกเขาเป็นแบบคงที่และเพียงผ่านเขตข้อมูลหากวิธีการช่วยเหลือที่พวกเขาต้องการ ตัวอย่างเช่นกำหนดรหัสข้างล่างนี้ผมชอบที่จะใช้วิธีการโทร # 2 class Foo { Bar _bar; public void DoSomethingWithBar() { // Method Call #1. DoSomethingWithBarImpl(); // Method Call #2. DoSomethingWithBarImpl(_bar); } private void DoSomethingWithBarImpl() { _bar.DoSomething(); } private static void DoSomethingWithBarImpl(Bar bar) { …

3
อะไรคือข้อได้เปรียบของ OOP ที่ใช้ต้นแบบมากกว่า OOP แบบอิงคลาส?
เมื่อฉันเริ่มเขียนโปรแกรมจาวาสคริปต์หลังจากจัดการกับ OOP เป็นหลักในบริบทของภาษาที่ใช้ในคลาสฉันก็สับสนว่าทำไม OOP ที่ใช้ต้นแบบจะเป็นที่ต้องการของ OOP แบบคลาส อะไรคือข้อได้เปรียบเชิงโครงสร้างของการใช้ OOP ที่อิงต้นแบบหากมี? (เช่นเราคาดหวังให้หน่วยความจำเร็วขึ้นหรือน้อยลงในบางแอปพลิเคชันหรือไม่) ข้อดีของมุมมองของนักเขียนคืออะไร? (เช่นการรหัสแอปพลิเคชันบางอย่างง่ายขึ้นหรือขยายรหัสของผู้อื่นโดยใช้การสร้างต้นแบบหรือไม่) โปรดอย่ามองคำถามนี้เป็นคำถามเกี่ยวกับ Javascript โดยเฉพาะ (ซึ่งมีข้อบกพร่องมากมายในช่วงหลายปีที่ไม่เกี่ยวข้องกับการทำต้นแบบ) โปรดดูในบริบทของข้อได้เปรียบเชิงทฤษฎีของการสร้างต้นแบบกับคลาส ขอขอบคุณ.

2
Alan Kay หมายถึงอะไรโดย“ การมอบหมาย” ในประวัติศาสตร์ยุคแรกของ Smalltalk
ฉันได้อ่านประวัติต้นของสมอลล์ทอล์คและมีการกล่าวถึง "การมอบหมาย" สองสามอย่างซึ่งทำให้ฉันถามความเข้าใจเกี่ยวกับความหมายของมัน: แม้ว่า OOP มาจากแรงจูงใจหลายอย่าง แต่ก็เป็นศูนย์กลาง มาตราส่วนขนาดใหญ่คือการค้นหาโครงร่างโมดูลที่ดีกว่าสำหรับระบบที่ซับซ้อนที่เกี่ยวข้องกับการซ่อนรายละเอียดและมาตราส่วนขนาดเล็กคือการค้นหาการมอบหมายรุ่นที่ยืดหยุ่นมากขึ้นแล้วพยายามกำจัดมันทั้งหมด (จากปี1960-66 - OOP ยุคแรกและแนวคิดการก่อสร้างอื่น ๆ ของอายุหกสิบเศษมาตรา I) สิ่งที่ผมได้จาก Simula ก็คือว่าตอนนี้คุณสามารถใช้ทดแทนการผูกและการมอบหมายกับเป้าหมาย สิ่งสุดท้ายที่คุณต้องการให้โปรแกรมเมอร์ทำคือยุ่งกับสถานะภายในแม้ว่าจะถูกนำเสนอเป็นรูปเป็นร่าง แต่วัตถุที่ควรจะนำเสนอเป็นเว็บไซต์ของพฤติกรรมในระดับสูงที่เหมาะสมมากขึ้นเพื่อใช้เป็นส่วนประกอบแบบไดนามิก (... ) มันเป็นเรื่องที่โชคร้ายที่สิ่งที่เรียกว่า "การเขียนโปรแกรมเชิงวัตถุ" ในทุกวันนี้เป็นเพียงการเขียนโปรแกรมแบบเก่า ๆ โปรแกรมจำนวนมากถูกโหลดด้วยการดำเนินการ "สไตล์การมอบหมาย" ซึ่งขณะนี้ทำโดยขั้นตอนการเชื่อมต่อที่มีราคาแพงกว่า (จากสไตล์ "เชิงวัตถุ"ส่วนที่ IV) ฉันถูกต้องในการตีความเจตนาว่าวัตถุนั้นมีความหมายว่าเป็นส่วนหน้าและวิธีการใด ๆ (หรือ "ข้อความ") ที่มีวัตถุประสงค์เพื่อตั้งค่าตัวแปรอินสแตนซ์บนวัตถุ (เช่น "การมอบหมาย") เป็นการเอาชนะวัตถุประสงค์หรือไม่ การตีความนี้ดูเหมือนจะได้รับการสนับสนุนโดยสองข้อความในภายหลังในหัวข้อที่สี่: เทคนิคสี่อย่างที่ใช้ร่วมกัน - สถานะถาวร, พหุสัณฐาน, การสร้างอินสแตนซ์และวิธีการตามเป้าหมายสำหรับวัตถุ สิ่งเหล่านี้ไม่จำเป็นต้องใช้ "ภาษาเชิงวัตถุ" ซึ่ง ALGOL …

3
เหตุใดโมเดลโดเมน anemic จึงถือว่าไม่ดีใน C # / OOP แต่สำคัญมากใน F # / FP
ในโพสต์บล็อกใน F # เพื่อความสนุกสนานและผลกำไรกล่าวว่า: ในการออกแบบฟังก์ชั่นมันสำคัญมากที่จะแยกพฤติกรรมออกจากข้อมูล ชนิดข้อมูลนั้นง่ายและ "โง่" จากนั้นคุณก็มีฟังก์ชั่นหลายอย่างที่ทำงานกับชนิดข้อมูลเหล่านั้น สิ่งนี้เป็นสิ่งที่ตรงกันข้ามกับการออกแบบเชิงวัตถุที่มีการรวมพฤติกรรมและข้อมูลเข้าด้วยกัน ท้ายที่สุดแล้วนั่นคือสิ่งที่ชั้นเรียน ในความเป็นจริงการออกแบบเชิงวัตถุในความเป็นจริงคุณไม่ควรมี แต่พฤติกรรม - ข้อมูลเป็นส่วนตัวและสามารถเข้าถึงได้ผ่านวิธีการ ในความเป็นจริงอู๊ดไม่ได้มีพฤติกรรมพอรอบประเภทข้อมูลถือเป็นสิ่งที่ไม่ดีและยังมีชื่อ: ความ " รูปแบบโดเมนโลหิตจาง " ระบุว่าใน C # เราดูเหมือนจะยืมต่อจาก F # และพยายามเขียนโค้ดสไตล์การทำงานมากขึ้น ทำไมเราไม่ยืมความคิดในการแยกข้อมูล / พฤติกรรมและคิดว่ามันไม่ดี? มันเป็นเพียงแค่ว่าคำจำกัดความไม่ได้มาพร้อมกับ OOP หรือมีเหตุผลที่เป็นรูปธรรมว่ามันไม่ดีใน C # ที่ด้วยเหตุผลบางอย่างไม่ได้ใช้ใน F # (และในความเป็นจริงจะกลับรายการ)? (หมายเหตุ: ฉันสนใจเป็นพิเศษในความแตกต่างใน C # / F # ที่สามารถเปลี่ยนความคิดเห็นของสิ่งที่ดี / ไม่ดีแทนที่จะเป็นบุคคลที่อาจไม่เห็นด้วยกับความเห็นทั้งในโพสต์บล็อก)

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

9
ถือว่าเป็นอันตรายหรือไม่? รหัสสามารถทำงานได้โดยไม่ได้หรือไม่
ตกลงดังนั้นชื่อเรื่องนั้นเป็นเรื่อง clickbaity เล็ก ๆ น้อย ๆ แต่อย่างจริงจังฉันได้รับการบอกไม่ต้องถามสักครู่ ฉันชอบที่มันส่งเสริมวิธีการที่จะใช้เป็นข้อความในแบบเชิงวัตถุจริง แต่นี่เป็นปัญหาที่จู้จี้ที่คร่ำครวญในหัวของฉัน ฉันสงสัยว่ารหัสที่เขียนได้ดีสามารถปฏิบัติตามหลักการ OO และหลักการทำงานได้ในเวลาเดียวกัน returnฉันพยายามที่จะกระทบความคิดเหล่านี้และจุดเกาะใหญ่ที่ผมเคยมีที่ดินบน ฟังก์ชั่นบริสุทธิ์มีสองคุณสมบัติ: การเรียกซ้ำ ๆ ด้วยอินพุตเดียวกันจะให้ผลลัพธ์เดียวกันเสมอ นี่ก็หมายความว่ามันไม่เปลี่ยนรูป สถานะของมันถูกตั้งค่าเพียงครั้งเดียว มันไม่มีผลข้างเคียง การเปลี่ยนแปลงเพียงอย่างเดียวที่เกิดจากการเรียกมันคือการสร้างผลลัพธ์ ดังนั้นวิธีการอย่างใดอย่างหนึ่งเกี่ยวกับการทำงานอย่างหมดจดถ้าคุณได้สาบานว่าจะใช้returnเป็นวิธีการสื่อสารผลลัพธ์ของคุณ? บอกไม่ได้ถามผลงานความคิดโดยใช้สิ่งที่บางคนจะพิจารณาผลข้างเคียง เมื่อฉันจัดการกับวัตถุฉันไม่ถามเกี่ยวกับสถานะภายในของวัตถุนั้น ฉันบอกสิ่งที่ฉันต้องทำและใช้สถานะภายในเพื่อหาว่าจะทำอย่างไรกับสิ่งที่ฉันบอกให้ทำ เมื่อฉันบอกมันฉันไม่ได้ถามว่ามันทำอะไร ฉันแค่หวังว่ามันจะทำอะไรบางอย่างเกี่ยวกับสิ่งที่มันถูกบอกให้ทำ ฉันคิดว่า Tell, Don't Ask เป็นมากกว่าชื่อที่แตกต่างกันสำหรับการห่อหุ้ม เมื่อฉันใช้returnฉันไม่มีความคิดในสิ่งที่เรียกว่าฉัน ฉันไม่สามารถพูดได้ว่าเป็นโปรโตคอลฉันต้องบังคับให้จัดการกับโปรโตคอลของฉัน ซึ่งในหลายกรณีได้รับการแสดงออกเป็นสถานะภายใน แม้ว่าสิ่งที่ได้รับการเปิดเผยไม่ได้ระบุอย่างชัดเจน แต่โดยทั่วไปแล้วการคำนวณบางอย่างที่ทำกับสถานะและอินพุต args มีอินเทอร์เฟซสำหรับการตอบสนองผ่านกำบังโอกาสที่จะนวดผลลัพธ์เป็นสิ่งที่มีความหมายมากกว่าสถานะภายในหรือการคำนวณ นั่นคือข้อความผ่าน ดูตัวอย่างนี้ ย้อนกลับไปในวันที่เมื่อดิสก์ไดรฟ์มีดิสก์อยู่ในนั้นและไดรฟ์หัวแม่มือคือสิ่งที่คุณทำในรถเมื่อล้อเย็นเกินไปที่จะสัมผัสด้วยนิ้วมือของคุณฉันได้รับการสอนว่าคนที่น่ารำคาญพิจารณาฟังก์ชั่น void swap(int *first, int *second)ดูเหมือนมีประโยชน์มาก แต่เราได้รับการสนับสนุนให้เขียนฟังก์ชันที่ส่งคืนผลลัพธ์ ดังนั้นฉันจึงใส่ใจเรื่องความเชื่อและเริ่มติดตามมัน แต่ตอนนี้ฉันเห็นผู้คนกำลังสร้างสถาปัตยกรรมที่วัตถุให้วิธีที่พวกเขาสร้างการควบคุมที่พวกเขาส่งผลลัพธ์ของพวกเขา …

8
สิ่งที่ควรได้รับอนุญาตภายในตัวต่อและผู้ตั้งค่า?
ฉันได้ข้อโต้แย้งอินเทอร์เน็ตที่น่าสนใจเกี่ยวกับวิธี getter และ setter และการห่อหุ้ม บางคนบอกว่าสิ่งที่พวกเขาควรทำคือมอบหมาย (setters) หรือตัวแปร access (getters) เพื่อให้พวกเขา "บริสุทธิ์" และทำให้แน่ใจว่าการห่อหุ้ม ฉันถูกต้องไหมที่สิ่งนี้จะเอาชนะจุดประสงค์ของการมีผู้ได้รับและผู้ตั้งถิ่นฐานในตอนแรกและการตรวจสอบความถูกต้องและตรรกะอื่น ๆ (โดยไม่มีผลข้างเคียงที่แปลกประหลาดของหลักสูตร) ​​ควรได้รับอนุญาตหรือไม่ การตรวจสอบควรเกิดขึ้นเมื่อใด เมื่อตั้งค่าภายใน setter (เพื่อป้องกันวัตถุจากการเข้าสู่สถานะที่ไม่ถูกต้อง - ความคิดเห็นของฉัน) ก่อนการตั้งค่านอกตัวตั้ง ภายในวัตถุก่อนทุกครั้งที่ใช้ค่า setter ได้รับอนุญาตให้เปลี่ยนค่าหรือไม่ (อาจแปลงค่าที่ถูกต้องเป็นตัวแทนภายในที่ยอมรับได้)

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

3
ความแตกต่างระหว่างคลาสย่อยและประเภทย่อยคืออะไร?
คำตอบการจัดอันดับสูงสุดที่จะคำถามนี้เกี่ยวกับ Liskov ชดเชยหลักการใช้เวลาปวดจะแยกแยะระหว่างข้อกำหนดย่อยและsubclass นอกจากนี้ยังทำให้จุดที่บางภาษาทำให้ทั้งสองเป็นคู่ในขณะที่คนอื่นทำไม่ได้ สำหรับภาษาเชิงวัตถุที่ฉันคุ้นเคยมากที่สุด (Python, C ++), "type" และ "class" เป็นแนวคิดที่มีความหมายเหมือนกัน ในแง่ของ C ++ การแยกประเภทย่อยและคลาสย่อยหมายความว่าอย่างไร กล่าวว่าเช่นว่าFooเป็น subclass FooBaseแต่ไม่ได้เป็นชนิดย่อยของ หากfooเป็นตัวอย่างของFooสายนี้จะ: FooBase* fbPoint = &foo; ไม่ถูกต้องอีกต่อไป?

11
ตัวแปรข้อผิดพลาดเป็นการต่อต้านรูปแบบหรือการออกแบบที่ดีหรือไม่?
เพื่อจัดการข้อผิดพลาดที่เป็นไปได้หลายอย่างที่ไม่ควรหยุดการทำงานฉันมีerrorตัวแปรที่ลูกค้าสามารถตรวจสอบและใช้เพื่อโยนข้อยกเว้น นี่เป็น Anti-Pattern หรือไม่ มีวิธีที่ดีกว่าในการจัดการกับเรื่องนี้? ตัวอย่างของสิ่งนี้คุณสามารถดูmysqli API ของ PHP สมมติว่าปัญหาการมองเห็น (ผู้เข้าถึงขอบเขตสาธารณะและส่วนตัวเป็นตัวแปรในคลาสหรือระดับโลกหรือไม่) ได้รับการจัดการอย่างถูกต้อง


1
เหตุใดโปรแกรมเมอร์จึงใช้ 'Acme' เป็นแพคเกจเนมสเปซหรือชื่อไดเรกทอรี [ปิด]
นี่อาจจะใช่หรือไม่ใช่คำถามโง่ ๆ ก็ได้ แต่ฉันอยากจะรู้คำตอบของบางสิ่งที่รบกวนฉันมาระยะหนึ่งแล้ว ฉันมักจะเห็นตัวอย่างการเขียนโปรแกรม / การประชุมที่โปรแกรมเมอร์ได้สร้างไดเรกทอรีที่เรียกว่าacmeใส่สิ่งต่างๆ อะไรAcmeหมายถึง? ทำไม Acme และไม่ใช่ Emca หรืออื่น ๆ Acme เป็นชื่อโฟลเดอร์ทั่วไปสำหรับจัดกลุ่มคลาส OOP เบ็ดเตล็ดหรือไม่ คำนี้มาจากที่ไหนในแง่ของการประชุมการเขียนโปรแกรม เท่าที่ฉันเห็นมันไม่มีส่วนเกี่ยวข้องกับโปรแกรมเมอร์ UI http://plan9.bell-labs.com/sys/doc/acme.html

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.