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

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

4
อลันเคย์หมายถึงอะไรโดย * คำว่า "เชิงวัตถุ" จริงๆ?
มีรายงานว่า Alan Kay เป็นผู้ประดิษฐ์คำว่า "เชิงวัตถุ" และเขาก็มักจะอ้างว่ามีการกล่าวว่าสิ่งที่เราเรียก OO วันนี้ไม่ใช่สิ่งที่เขาหมายถึง ตัวอย่างเช่นฉันเพิ่งพบสิ่งนี้บน Google: ฉันสร้างคำว่า 'เชิงวัตถุ' และฉันสามารถบอกคุณได้ว่าฉันไม่มี C ++ ในใจ - Alan Kay, OOPSLA '97 ผมคลับคล้ายคลับคลาได้ยินบางสิ่งบางอย่างที่ชาญฉลาดสวยเกี่ยวกับสิ่งที่เขาไม่ได้หมายความว่า บางสิ่งบางอย่างตามสายของ "การส่งข้อความ" คุณรู้ไหมว่าเขาหมายถึงอะไร? คุณช่วยกรอกรายละเอียดเพิ่มเติมเกี่ยวกับสิ่งที่เขาหมายและสิ่งที่แตกต่างจาก OO ทั่วไปของวันนี้? กรุณาแบ่งปันการอ้างอิงบางอย่างถ้าคุณมี ขอบคุณ

10
ไม่มีวัตถุพฤติกรรมใน OOP - ขึ้นเขียงการออกแบบของฉัน
แนวคิดพื้นฐานที่อยู่เบื้องหลัง OOP คือข้อมูลและพฤติกรรม (ตามข้อมูลนั้น) แยกออกไม่ได้และพวกเขาจะถูกควบคู่ไปกับแนวคิดของวัตถุของคลาส วัตถุมีข้อมูลและวิธีการที่ทำงานกับ (และข้อมูลอื่น ๆ ) เห็นได้ชัดว่าตามหลักการของ OOP วัตถุที่เป็นเพียงข้อมูล (เช่นโครงสร้างของ C) นั้นถือว่าเป็นรูปแบบการต่อต้าน จนถึงตอนนี้ดีมาก ปัญหาคือฉันสังเกตว่ารหัสของฉันดูเหมือนจะเพิ่มมากขึ้นเรื่อย ๆ ในทิศทางของรูปแบบการต่อต้านเมื่อเร็ว ๆ นี้ ดูเหมือนว่ายิ่งฉันพยายามที่จะบรรลุข้อมูลที่ซ่อนอยู่ระหว่างคลาสและการออกแบบที่คู่กันอย่างหลวม ๆ ยิ่งคลาสของฉันได้รับการผสมของข้อมูลที่บริสุทธิ์มากขึ้นเท่านั้นไม่มีคลาสพฤติกรรมและพฤติกรรมทั้งหมดไม่มีคลาสข้อมูล โดยทั่วไปฉันออกแบบคลาสในวิธีที่ลดการรับรู้ของการมีอยู่ของคลาสอื่นและลดความรู้ของอินเทอร์เฟซของคลาสอื่น ฉันบังคับใช้สิ่งนี้โดยเฉพาะอย่างยิ่งจากบนลงล่างชั้นเรียนระดับล่างไม่ทราบเกี่ยวกับชั้นเรียนระดับสูงกว่า เช่น: สมมติว่าคุณมี API เกมการ์ดทั่วไป Cardคุณได้เรียน ตอนนี้Cardคลาสนี้จำเป็นต้องกำหนดทัศนวิสัยให้กับผู้เล่น วิธีหนึ่งคือการมีboolean isVisible(Player p)ในCardชั้นเรียน อีกอย่างคือให้มีboolean isVisible(Card c)ในPlayerชั้นเรียน ฉันไม่ชอบวิธีแรกโดยเฉพาะอย่างยิ่งในขณะที่มันมอบความรู้เกี่ยวกับระดับที่สูงกว่าPlayerระดับให้อยู่ในระดับที่ต่ำกว่าCardระดับ แต่ฉันเลือกใช้ตัวเลือกที่สามที่เรามีViewportคลาสซึ่งให้ a Playerและรายการการ์ดกำหนดว่าจะมองเห็นการ์ดใด อย่างไรก็ตามวิธีนี้ปล้นทั้งสองCardและPlayerคลาสของฟังก์ชั่นสมาชิกที่เป็นไปได้ เมื่อคุณทำสิ่งอื่นนอกเหนือจากการมองเห็นการ์ดแล้วคุณจะเหลือCardและPlayerคลาสที่มีข้อมูลล้วนๆเนื่องจากมีการใช้งานฟังก์ชั่นทั้งหมดในคลาสอื่นซึ่งส่วนใหญ่เป็นคลาสที่ไม่มีข้อมูลเช่นเดียวกับวิธีการViewportข้างต้น ชัดเจนว่าเป็นแนวคิดหลักของ OOP วิธีใดถูกต้อง ฉันควรจะทำอย่างไรในการลดการพึ่งพาซึ่งกันและกันของชั้นเรียนและลดความรู้และการมีเพศสัมพันธ์ให้น้อยที่สุด แต่ไม่มีการออกแบบแปลก ๆ …

5
ฟังก์ชั่นการเขียนโปรแกรมเทียบกับ OOP [ปิด]
ฉันได้ยินมาหลายเรื่องเกี่ยวกับการใช้ภาษาที่ใช้งานได้เช่น Haskell เป็นต้น ข้อดีและข้อเสียของการเขียนโปรแกรมเชิงฟังก์ชันกับการเขียนโปรแกรมเชิงวัตถุคืออะไร

12
เหตุใด C จึงไม่ถือว่าเป็นภาษา 'เชิงวัตถุ'
ดูเหมือนว่า C มีวัตถุเสมือนของตัวเองเช่น 'structs' ซึ่งถือได้ว่าเป็นวัตถุ (ในระดับสูงที่เราคิดว่าปกติ) และไฟล์ C เองก็แยก "โมดุล" เป็นหลักใช่มั้ย ถ้าเช่นนั้นโมดูลก็ไม่เหมือน 'วัตถุ' ด้วยใช่ไหม ฉันสับสนว่าทำไม C ซึ่งดูเหมือนคล้ายกับ C ++ ถือเป็นภาษา "ขั้นตอน" ในระดับต่ำซึ่ง C ++ เป็นระดับสูง "เชิงวัตถุ" * แก้ไข: (ชี้แจง) สาเหตุและสถานที่มีการลากเส้นสำหรับ 'วัตถุ' คืออะไรและไม่?

15
อะไรทำให้ C เป็นที่นิยมในยุคของ OOP [ปิด]
ฉันเขียนโค้ดจำนวนมากทั้งใน C และ C ++ แต่ไม่ได้คาดหวังว่า C จะเป็นภาษาที่ได้รับความนิยมอันดับสองรองจาก Java เล็กน้อย ดัชนีชุมชนการเขียนโปรแกรม TIOBE ฉันอยากรู้ว่าทำไมในยุค OOP นี้ C ยังคงเป็นที่นิยม? โปรดทราบว่าภาษาการเขียนโปรแกรมยอดนิยม 4 จาก 5 อันดับแรกคือภาษา "ทันสมัย" ซึ่งเป็นภาษาเชิงวัตถุ ตอนนี้ฉันยอมรับว่าคุณสามารถใช้ OOP ใน C ได้บ้าง แต่มันค่อนข้างเจ็บปวดและไม่เหมาะสม (อย่างน้อยก็เมื่อเทียบกับ C ++ ฉันเดา) ดังนั้นอะไรที่ทำให้ C เป็นที่นิยม มันมีประสิทธิภาพหรือไม่ เป็นระดับต่ำ ห้องสมุดส่วนใหญ่ที่มีอยู่แล้วหรืออย่างอื่น?

22
ทำไม OOP ถึงยาก? [ปิด]
เมื่อฉันเริ่มใช้ภาษาเชิงวัตถุ (Java) ฉันเพิ่งจะ "เจ๋ง" และเริ่มเขียนโค้ด ฉันไม่เคยคิดถึงเรื่องนี้จนกระทั่งเมื่อไม่นานมานี้หลังจากอ่านคำถามมากมายเกี่ยวกับ OOP ความประทับใจทั่วไปที่ฉันได้รับคือผู้คนต่อสู้กับมัน เนื่องจากฉันไม่ได้คิดว่ามันยากและฉันจะไม่พูดว่าฉันเป็นอัจฉริยะฉันจึงคิดว่าฉันต้องพลาดบางสิ่งหรือเข้าใจผิด ทำไม OOP จึงเข้าใจยาก คือมันยากที่จะเข้าใจ?

22
OOP ยากหรือไม่เพราะไม่ใช่ธรรมชาติ?
มักจะได้ยินว่า OOP นั้นสอดคล้องกับวิธีที่ผู้คนคิดเกี่ยวกับโลก แต่ฉันจะไม่เห็นด้วยอย่างยิ่งกับข้อความนี้: เรา (หรืออย่างน้อยฉัน) สร้างแนวคิดโลกในแง่ของความสัมพันธ์ระหว่างสิ่งต่าง ๆ ที่เราพบ แต่จุดเน้นของ OOP คือการออกแบบคลาสบุคคลและลำดับชั้นของพวกเขา โปรดสังเกตว่าในชีวิตประจำวันความสัมพันธ์และการกระทำมีอยู่ส่วนใหญ่ระหว่างวัตถุที่จะเป็นอินสแตนซ์ของคลาสที่ไม่เกี่ยวข้องใน OOP ตัวอย่างของความสัมพันธ์เช่น: "หน้าจอของฉันอยู่ด้านบนของตาราง"; "ฉัน (มนุษย์) กำลังนั่งอยู่บนเก้าอี้"; "รถยนต์อยู่บนถนน"; "ฉันพิมพ์บนแป้นพิมพ์"; "เครื่องชงกาแฟต้มน้ำ" "ข้อความจะปรากฏในหน้าต่างเทอร์มินัล" เราคิดในแง่ของ bivalent (บางครั้ง trivalent เช่นใน "ฉันให้คุณดอกไม้") คำกริยาที่กริยาคือการกระทำ (ความสัมพันธ์) ที่ทำงานบนวัตถุสองชิ้นเพื่อสร้างผลลัพธ์ / การกระทำบางอย่าง โฟกัสอยู่ในการดำเนินการและทั้งสอง (หรือสาม) [ไวยากรณ์] วัตถุมีความสำคัญเท่าเทียมกัน เปรียบเทียบกับ OOP ที่คุณต้องค้นหาวัตถุหนึ่ง (คำนาม) ก่อนและบอกให้ดำเนินการบางอย่างกับวัตถุอื่น วิธีการคิดเปลี่ยนจากการกระทำ / คำกริยาที่ใช้กับคำนามเป็นคำนามปฏิบัติการบนคำนาม - ราวกับว่าทุกอย่างถูกพูดด้วยเสียงเฉยๆหรือสะท้อนเสียงเช่น "ข้อความแสดงโดยหน้าต่างเทอร์มินัล" หรืออาจจะ …

10
คุณจะหลีกเลี่ยง getters และ setters ได้อย่างไร
ฉันมีช่วงเวลาที่ยากลำบากในการออกแบบชั้นเรียนในแบบที่เป็นจริง ฉันอ่านแล้วว่าวัตถุแสดงพฤติกรรมของพวกเขาไม่ใช่ข้อมูล ดังนั้นแทนที่จะใช้ getter / setters เพื่อแก้ไขข้อมูลวิธีการของคลาสที่กำหนดควรเป็น "คำกริยา" หรือการดำเนินการกับวัตถุ ยกตัวอย่างเช่นใน 'บัญชี' วัตถุเราจะมีวิธีการWithdraw()และDeposit()มากกว่าsetAmount()ฯลฯ ดู: ทำไมทะเยอทะยานและหมาวิธีเป็นความชั่วร้าย ตัวอย่างเช่นกำหนดคลาสลูกค้าที่เก็บข้อมูลจำนวนมากเกี่ยวกับลูกค้าเช่นชื่อ DOB, Tel, ที่อยู่เป็นต้นเราจะหลีกเลี่ยง getter / setters เพื่อรับและตั้งค่าคุณลักษณะเหล่านั้นได้อย่างไร วิธีการพิมพ์ 'พฤติกรรม' ประเภทใดที่สามารถเขียนเพื่อเติมข้อมูลทั้งหมดได้

4
รูปแบบโดเมนที่หลากหลาย - พฤติกรรมนั้นเข้ากันได้อย่างไร
ในการอภิปรายเกี่ยวกับโมเดลโดเมน Rich and Anemic อินเทอร์เน็ตเต็มไปด้วยคำแนะนำทางปรัชญา แต่ย่อมาจากตัวอย่างที่เชื่อถือได้ วัตถุประสงค์ของคำถามนี้คือการหาแนวทางที่ชัดเจนและตัวอย่างที่เป็นรูปธรรมของโมเดลการออกแบบที่ขับเคลื่อนด้วยโดเมนที่เหมาะสม (นึกคิดใน C #.) สำหรับตัวอย่างในโลกแห่งความจริงการใช้ DDD นี้ดูเหมือนจะผิด: โดเมน WorkItem รุ่นด้านล่างไม่มีอะไรนอกจากถุงคุณสมบัติซึ่ง Entity Framework ใช้สำหรับฐานข้อมูลรหัสแรก ต่อฟาวเลอร์ก็เป็นโรคโลหิตจาง เห็นได้ชัดว่าชั้น WorkItemService เป็นความเข้าใจผิดทั่วไปของบริการโดเมน มันมีพฤติกรรม / ตรรกะทางธุรกิจทั้งหมดสำหรับ WorkItem ต่อ Yemelyanov และคนอื่น ๆ ก็เป็นขั้นตอน (หน้า 6) ดังนั้นถ้าด้านล่างผิดฉันจะทำให้ถูกต้องได้อย่างไร พฤติกรรมเช่นAddStatusUpdateหรือCheckoutควรเป็นของคลาส WorkItem ที่ถูกต้องหรือไม่ แบบจำลอง WorkItem ควรพึ่งพาอะไร? public class WorkItemService : IWorkItemService { private IUnitOfWorkFactory _unitOfWorkFactory; …

13
วัตถุใน OOP จำเป็นต้องแสดงถึงเอนทิตีหรือไม่?
วัตถุต้องแสดงถึงนิติบุคคลหรือไม่ โดยนิติบุคคลที่ผมหมายถึงสิ่งที่ชอบProduct, Motorเป็นParkingLotฯลฯ ทางกายภาพหรือแม้กระทั่งวัตถุแนวคิดที่ชัดเจนไม่ใช่ทางกายภาพ - บางสิ่งบางอย่างที่กำหนดไว้อย่างดีกับข้อมูลหลักบางอย่างชัดเจนที่อยู่ในวัตถุและบางฟังก์ชั่น / วิธีการ ที่ทำงานอย่างชัดเจนกับข้อมูลหลัก ตัวอย่างเช่นฉันสามารถมีวัตถุของ a Demon, นิติบุคคลในตัวเองหนึ่งในจินตนาการและอาจไม่ใช่ทางกายภาพ แต่ยังคงเป็นนิติบุคคล วัตถุสามารถเป็นเพียงชุดของวิธีการชุดของขั้นตอนทั่วไปที่เชื่อมโยงกับเป้าหมายทั่วไปได้หรือไม่ ตัวอย่าง: สามารถเรียกคลาสได้MotorOperationsหรือMotorActionsในกรณีที่ไม่มีเอนทิตี แต่วิธีการภายในคลาสสามารถทำสิ่งต่าง ๆ ได้ getMotorDataFromHTMLForm () getMotorManufacturers () selectMotorFromUserRequirements ($ ต้องการ) canMotorCanHandleOperatingConditions ($ เงื่อนไข) computePowerConsumptionForMotor ($ ID) โดยทั่วไปคลาสจะถูกกำหนดให้เป็นศูนย์กลางข้อมูลของการดำเนินการกับออบเจ็กต์ + กับข้อมูล ดังนั้นสำหรับ a Motorอาจมีตัวแปรยนต์บางอย่างที่เกี่ยวข้องกับข้อมูลจำเพาะของมอเตอร์และอาจมีการดำเนินการที่รวมข้อมูลเหล่านั้นเพื่อสร้างบางสิ่งบางอย่าง ในกรณีของฉันมันเหมือนกับว่าฉันมีคลาสที่มีการดำเนินงานเกี่ยวกับ data + data ที่ส่งผ่านคลาสไม่มี data centric สำหรับ "Motor Operations" นอกเหนือจากข้อมูลชั่วคราวที่ส่งผ่านคลาส …

2
มีหลักการ OO ใดบ้างที่ใช้ได้กับ Javascript จริงหรือไม่
Javascript เป็นภาษาเชิงวัตถุต้นแบบ แต่สามารถเป็นคลาสได้หลายวิธีโดย: การเขียนฟังก์ชั่นที่จะใช้เป็นคลาสด้วยตัวเอง ใช้ระบบระดับดีในกรอบ (เช่นmootools Class.Class ) สร้างจาก Coffeescript ในตอนแรกฉันมักจะเขียนโค้ดตามคลาสใน Javascript และพึ่งพามันอย่างมาก อย่างไรก็ตามเมื่อเร็ว ๆ นี้ฉันได้ใช้กรอบงาน Javascript และNodeJSที่หายไปจากความคิดในชั้นเรียนนี้และพึ่งพาเพิ่มเติมเกี่ยวกับลักษณะแบบไดนามิกของรหัสเช่น: การเขียนโปรแกรม Async การใช้และการเขียนโค้ดที่ใช้ callbacks / events การโหลดโมดูลด้วย RequireJS (เพื่อไม่ให้รั่วไหลไปยัง namespace ทั่วโลก) แนวคิดการเขียนโปรแกรมเชิงหน้าที่เช่นรายการความเข้าใจ (แผนที่ตัวกรองและอื่น ๆ ) เหนือสิ่งอื่นใด สิ่งที่ฉันรวบรวมได้คือหลักการและรูปแบบ OO ส่วนใหญ่ที่ฉันอ่าน (เช่นรูปแบบ SOLID และ GoF) ถูกเขียนขึ้นสำหรับภาษา OO ที่อ้างอิงกับคลาสในใจเช่น Smalltalk และ C ++ แต่มีผู้ใดบ้างที่สามารถใช้งานได้กับภาษาต้นแบบเช่น Javascript …

12
ประโยชน์ของการเขียนโปรแกรมเชิงวัตถุบนการเขียนโปรแกรมตามขั้นตอนคืออะไร
ฉันพยายามที่จะเข้าใจความแตกต่างระหว่างภาษาเชิงปฏิบัติเช่น C และภาษาเชิงวัตถุเช่น C ++ ฉันไม่เคยใช้ C ++ แต่ฉันได้คุยกับเพื่อน ๆ เกี่ยวกับวิธีแยกแยะทั้งสอง ฉันได้รับการบอกว่า C ++ มีแนวคิดเชิงวัตถุเช่นเดียวกับโหมดสาธารณะและส่วนตัวสำหรับการกำหนดตัวแปร: สิ่งที่ C ไม่มี ฉันไม่เคยใช้สิ่งเหล่านี้ในขณะที่กำลังพัฒนาโปรแกรมใน Visual Basic.NET: ประโยชน์ของสิ่งเหล่านี้คืออะไร? ฉันได้รับแจ้งด้วยว่าหากตัวแปรเป็นแบบสาธารณะมันสามารถเข้าถึงได้ทุกที่ แต่ไม่ชัดเจนว่ามันแตกต่างจากตัวแปรทั่วโลกในภาษาเช่น C หรือไม่และยังไม่ชัดเจนว่าตัวแปรส่วนตัวแตกต่างจากตัวแปรท้องถิ่นอย่างไร อีกสิ่งหนึ่งที่ฉันได้ยินคือเพื่อเหตุผลด้านความปลอดภัยหากจำเป็นต้องเข้าถึงฟังก์ชั่นควรได้รับการสืบทอดก่อน กรณีใช้งานคือผู้ดูแลระบบควรมีสิทธิ์มากเท่าที่ต้องการและไม่ใช่ทุกอย่าง แต่ดูเหมือนว่าเงื่อนไขจะทำงานได้ดี: if ( login == "admin") { // invoke the function } ทำไมสิ่งนี้จึงไม่เหมาะ เนื่องจากดูเหมือนว่าจะมีวิธีการในการทำทุกอย่างที่เกี่ยวกับวัตถุทำไมฉันจึงควรใส่ใจเกี่ยวกับการเขียนโปรแกรมเชิงวัตถุ

11
เหตุใดจึงเป็นพื้นฐานสำหรับวัตถุทั้งหมดท้อแท้ใน C ++
Stroustrup กล่าวว่า "อย่าคิดค้นฐานเฉพาะสำหรับคลาสทั้งหมดของคุณ (คลาส Object) โดยทันทีคุณสามารถทำได้ดีกว่านี้หากไม่มีคลาสที่มากที่สุด / ส่วนใหญ่" (ภาษา C ++ ภาษาที่สี่รุ่น Sec 1.3.4) ทำไมพื้นฐานสำหรับทุกสิ่งโดยทั่วไปเป็นความคิดที่ไม่ดีและเมื่อใดที่เหมาะสมที่จะสร้าง

4
เหตุใดนักพัฒนาซอฟต์แวร์หลายคนจึงละเมิดหลักการเปิด / ปิด
เหตุใดนักพัฒนาซอฟต์แวร์หลายคนจึงละเมิดหลักการเปิด / ปิดโดยการปรับเปลี่ยนหลายอย่างเช่นการเปลี่ยนชื่อฟังก์ชั่นซึ่งจะทำให้แอปพลิเคชั่นแตกหลังจากอัพเกรด คำถามนี้ข้ามไปที่หัวของฉันหลังจากเวอร์ชันที่รวดเร็วและต่อเนื่องในไลบรารีReact ทุกช่วงเวลาสั้น ๆ ฉันสังเกตเห็นการเปลี่ยนแปลงมากมายในไวยากรณ์ชื่อส่วนประกอบ ... ฯลฯ ตัวอย่างในReact รุ่นที่กำลังมา : คำเตือนการเลิกใช้ใหม่ การเปลี่ยนแปลงที่ยิ่งใหญ่ที่สุดคือเราได้ดึง React.PropTypes และ React.createClass ลงในแพ็คเกจของตัวเองแล้ว ทั้งสองยังสามารถเข้าถึงได้ผ่านวัตถุหลักปฏิกิริยา แต่การใช้อย่างใดอย่างหนึ่งจะบันทึกคำเตือนการคัดค้านเพียงครั้งเดียวไปยังคอนโซลเมื่ออยู่ในโหมดการพัฒนา นี่จะเป็นการเปิดใช้งานการปรับขนาดโค้ดในอนาคต คำเตือนเหล่านี้จะไม่ส่งผลต่อการทำงานของแอปพลิเคชันของคุณ อย่างไรก็ตามเราทราบว่าอาจทำให้เกิดความไม่พอใจโดยเฉพาะอย่างยิ่งหากคุณใช้กรอบการทดสอบที่ถือว่า console.error เป็นความล้มเหลว การเปลี่ยนแปลงเหล่านี้ถือเป็นการละเมิดหลักการนั้นหรือไม่? ในฐานะผู้เริ่มต้นสำหรับบางอย่างเช่นReactฉันจะเรียนรู้ได้อย่างไรด้วยการเปลี่ยนแปลงอย่างรวดเร็วในไลบรารี (มันน่าผิดหวังมาก)

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

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