คำถามติดแท็ก oop

การเขียนโปรแกรมเชิงวัตถุเป็นกระบวนทัศน์การเขียนโปรแกรมโดยใช้ "วัตถุ": โครงสร้างข้อมูลประกอบด้วยเขตข้อมูลและวิธีการร่วมกับการโต้ตอบของพวกเขา

11
pImpl สำนวนที่ใช้จริงในการปฏิบัติจริง
ฉันกำลังอ่านหนังสือ "เจ๋ง C ++" โดย Herb Sutter และในหนังสือเล่มนั้นฉันได้เรียนรู้เกี่ยวกับสำนวน pImpl โดยพื้นฐานแล้วความคิดคือการสร้างโครงสร้างสำหรับprivateวัตถุของclassและจัดสรรแบบไดนามิกเพื่อลดเวลาในการรวบรวม (และซ่อนการใช้งานส่วนตัวในลักษณะที่ดีกว่า) ตัวอย่างเช่น: class X { private: C c; D d; } ; สามารถเปลี่ยนเป็น: class X { private: struct XImpl; XImpl* pImpl; }; และใน CPP คำจำกัดความ: struct X::XImpl { C c; D d; }; ดูเหมือนว่าจะน่าสนใจ แต่ฉันไม่เคยเห็นวิธีการนี้มาก่อนทั้งใน บริษัท ที่ฉันเคยทำงานหรือในโครงการโอเพ่นซอร์สที่ฉันเคยเห็นซอร์สโค้ด ดังนั้นฉันสงสัยว่าเทคนิคนี้ใช้ในทางปฏิบัติจริง ๆ หรือไม่ …
165 c++  oop  pimpl-idiom 

5
ฉันจะเข้าถึงตัวแปรคลาส“ คงที่” ภายในวิธีการเรียนใน Python ได้อย่างไร
ถ้าฉันมีรหัสหลามต่อไปนี้: class Foo(object): bar = 1 def bah(self): print(bar) f = Foo() f.bah() มันบ่น NameError: global name 'bar' is not defined ฉันจะเข้าถึงตัวแปร class / static ได้อย่างไรbarภายใน method bah?

8
ทำซ้ำมากกว่าคุณลักษณะของวัตถุในหลาม
ฉันมีวัตถุหลามที่มีคุณลักษณะและวิธีการหลายอย่าง ฉันต้องการวนซ้ำคุณลักษณะของวัตถุ class my_python_obj(object): attr1='a' attr2='b' attr3='c' def method1(self, etc, etc): #Statements ฉันต้องการสร้างพจนานุกรมที่มีคุณลักษณะของวัตถุทั้งหมดและค่าปัจจุบันของพวกเขา แต่ฉันต้องการที่จะทำมันในแบบไดนามิก (ดังนั้นถ้าภายหลังฉันเพิ่มคุณสมบัติอื่นที่ฉันไม่ต้องจำเพื่อปรับปรุงฟังก์ชั่นของฉันด้วย) ในตัวแปร php สามารถใช้เป็นกุญแจได้ แต่วัตถุในไพ ธ อนนั้นไม่สามารถอธิบายได้และถ้าฉันใช้เครื่องหมายจุดสำหรับสิ่งนี้มันจะสร้างแอททริบิวใหม่ที่มีชื่อ var ของฉันซึ่งไม่ใช่เจตนาของฉัน เพียงเพื่อทำให้สิ่งต่าง ๆ ชัดเจนขึ้น: def to_dict(self): '''this is what I already have''' d={} d["attr1"]= self.attr1 d["attr2"]= self.attr2 d["attr3"]= self.attr3 return d · def to_dict(self): '''this is what I …

17
มีอินเทอร์เฟซมากกว่าวิธีการที่ถูกต้องหรือไม่
ดังนั้นสมมติว่าฉันมีอินเทอร์เฟซนี้: public interface IBox { public void setSize(int size); public int getSize(); public int getArea(); //...and so on } และฉันมีคลาสที่ใช้งาน: public class Rectangle implements IBox { private int size; //Methods here } ถ้าฉันต้องการใช้อินเทอร์เฟซ IBox ฉันไม่สามารถสร้างอินสแตนซ์ของมันได้ตามจริง: public static void main(String args[]) { Ibox myBox=new Ibox(); } ขวา? ดังนั้นฉันต้องทำสิ่งนี้จริง: public static void …

9
ความแตกต่างระหว่างภาษาการทำงานและการเขียนโปรแกรมที่จำเป็นคืออะไร?
ภาษากระแสหลักส่วนใหญ่รวมถึงภาษาการเขียนโปรแกรมเชิงวัตถุ (OOP) เช่น C #, Visual Basic, C ++ และ Java ได้รับการออกแบบมาเพื่อสนับสนุนการเขียนโปรแกรมที่จำเป็น (ขั้นตอน) ส่วนใหญ่ในขณะที่ Haskell / gofer เหมือนภาษาล้วนๆ ใครสามารถอธิบายเพิ่มเติมเกี่ยวกับความแตกต่างระหว่างสองวิธีในการเขียนโปรแกรมได้อย่างไร ฉันรู้ว่ามันขึ้นอยู่กับความต้องการของผู้ใช้ในการเลือกวิธีการเขียนโปรแกรม แต่ทำไมถึงแนะนำให้เรียนรู้ภาษาที่ใช้งานได้

22
การวางแนววัตถุใน C
อะไรจะเป็นชุดของแฮ็ก preprocessor ดี (เข้ากันได้กับ ANSI C89 / ISO C90) ซึ่งเปิดใช้การวางแนววัตถุที่น่าเกลียด (แต่ใช้งานได้) ใน C? ฉันคุ้นเคยกับภาษาเชิงวัตถุต่าง ๆ ดังนั้นโปรดอย่าตอบด้วยคำตอบเช่น "เรียนรู้ C ++!" ฉันได้อ่าน " การเขียนโปรแกรมเชิงวัตถุด้วย ANSI C " (ระวัง: รูปแบบ PDF ) และวิธีแก้ปัญหาที่น่าสนใจอื่น ๆ แต่ฉันสนใจ :-)! ดูเพิ่มเติมคุณสามารถเขียนโค้ดเชิงวัตถุใน C ได้หรือไม่
157 c  oop  object 

8
วิธีการเรียกวิธีผู้ปกครองจากชั้นเรียนเด็กในจาวาสคริปต์?
ฉันใช้เวลาสองสามชั่วโมงสุดท้ายพยายามหาวิธีแก้ปัญหาของฉัน แต่ดูเหมือนจะสิ้นหวัง โดยทั่วไปฉันจำเป็นต้องรู้วิธีการเรียกวิธีผู้ปกครองจากชั้นเรียนเด็ก ทุกสิ่งที่ฉันได้พยายามจนถึงตอนนี้ไม่ว่าจะใช้งานไม่ได้หรือเขียนทับวิธีการหลัก ฉันใช้รหัสต่อไปนี้เพื่อตั้งค่า OOP ใน javascript: // SET UP OOP // surrogate constructor (empty function) function surrogateCtor() {} function extend(base, sub) { // copy the prototype from the base to setup inheritance surrogateCtor.prototype = base.prototype; sub.prototype = new surrogateCtor(); sub.prototype.constructor = sub; } // parent class function ParentObject(name) …

10
เหตุใดเขตข้อมูลส่วนตัวจึงเป็นประเภทส่วนตัวไม่ใช่เช่นนั้น
ใน C # (และภาษาอื่น ๆ อีกมากมาย) การเข้าใช้ฟิลด์ส่วนตัวของอินสแตนซ์อื่นประเภทเดียวกันนั้นถูกต้องตามกฎหมาย ตัวอย่างเช่น: public class Foo { private bool aBool; public void DoBar(Foo anotherFoo) { if (anotherFoo.aBool) ... } } เนื่องจากข้อกำหนดC # (ส่วน 3.5.1, 3.5.2) ระบุว่าการเข้าถึงฟิลด์ส่วนตัวอยู่ในประเภทไม่ใช่อินสแตนซ์ ฉันกำลังคุยเรื่องนี้กับเพื่อนร่วมงานและเรากำลังพยายามหาเหตุผลว่าทำไมมันถึงใช้งานได้ (แทนที่จะ จำกัด การเข้าถึงอินสแตนซ์เดียวกัน) อาร์กิวเมนต์ที่ดีที่สุดที่เราสามารถหาได้คือการตรวจสอบความเท่าเทียมกันซึ่งคลาสอาจต้องการเข้าถึงฟิลด์ส่วนตัวเพื่อกำหนดความเท่าเทียมกันกับอินสแตนซ์อื่น มีเหตุผลอื่นอีกไหม? หรือเหตุผลทองบางอย่างที่หมายความว่ามันต้องทำงานอย่างนี้หรือบางสิ่งจะเป็นไปไม่ได้อย่างสมบูรณ์?


13
ผู้แทนคืออะไร [ปิด]
ปิด คำถามนี้จะต้องมีมากขึ้นมุ่งเน้น ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้มุ่งเน้นที่ปัญหาเดียวโดยแก้ไขโพสต์นี้ ปิดให้บริการใน6 ปีที่ผ่านมา ปรับปรุงคำถามนี้ ฉันสับสนว่าบทบาทที่แท้จริงของผู้รับมอบสิทธิ์คืออะไร ฉันถูกถามคำถามนี้หลายครั้งในการสัมภาษณ์ของฉัน แต่ฉันไม่คิดว่าผู้สัมภาษณ์พอใจกับคำตอบของฉัน ใครสามารถบอกคำจำกัดความที่ดีที่สุดในหนึ่งประโยคพร้อมตัวอย่างที่ใช้ได้จริง
152 oop  delegates 

18
วิธีการผูกมัด - ทำไมมันเป็นการปฏิบัติที่ดีหรือไม่?
วิธีการผูกมัดคือการปฏิบัติของวิธีการวัตถุกลับวัตถุเองเพื่อให้ผลที่จะเรียกวิธีอื่น แบบนี้: participant.addSchedule(events[1]).addSchedule(events[2]).setStatus('attending').save() สิ่งนี้น่าจะถือเป็นแนวปฏิบัติที่ดีเนื่องจากมันสร้างโค้ดที่อ่านได้หรือ "ส่วนต่อประสานที่คล่องแคล่ว" อย่างไรก็ตามสำหรับฉันแล้วมันดูเหมือนว่าจะทำลายสัญกรณ์การโทรวัตถุที่บอกเป็นนัยโดยการวางแนววัตถุเอง - โค้ดผลลัพธ์ไม่ได้แสดงถึงการดำเนินการกับผลลัพธ์ของวิธีการก่อนหน้านี้ซึ่งเป็นวิธีที่รหัสเชิงวัตถุโดยทั่วไปคาดว่าจะทำงาน: participant.getSchedule('monday').saveTo('monnday.file') ความแตกต่างนี้จัดการเพื่อสร้างความหมายที่แตกต่างกันสองแบบสำหรับเครื่องหมายจุดของ "การเรียกอ็อบเจกต์ผลลัพธ์": ในบริบทของการโยงโซ่ตัวอย่างข้างต้นจะอ่านเป็นการบันทึกออบเจ็กต์ผู้เข้าร่วมแม้ว่าตัวอย่างนั้นตั้งใจจะบันทึกกำหนดการ วัตถุที่ได้รับจาก getSchedule ฉันเข้าใจว่าความแตกต่างที่นี่คือว่าวิธีการที่เรียกว่าควรจะคาดหวังที่จะคืนบางสิ่งบางอย่างหรือไม่ แต่ทั้งสองกรณีนี้ไม่สามารถแยกความแตกต่างจากสัญกรณ์เองได้เฉพาะจากความหมายของวิธีการที่ถูกเรียก เมื่อไม่มีการใช้การโยงวิธีฉันสามารถทราบได้เสมอว่าการเรียกใช้เมธอดดำเนินการกับบางสิ่งที่เกี่ยวข้องกับผลลัพธ์ของการโทรก่อนหน้า - ด้วยการผูกมัดการสันนิษฐานนี้แบ่งและฉันต้องประมวลผลทั้งโซ่เพื่อเข้าใจว่าวัตถุจริง ๆ เรียกว่าเป็นจริง ตัวอย่างเช่น: participant.attend(event).setNotifications('silent').getSocialStream('twitter').postStatus('Joining '+event.name).follow(event.getSocialId('twitter')) ที่นั่นการเรียกเมธอดสองวิธีสุดท้ายอ้างถึงผลลัพธ์ของ getSocialStream ในขณะที่วิธีการก่อนที่จะอ้างถึงผู้เข้าร่วม อาจเป็นวิธีที่ไม่ถูกต้องในการเขียนเชนที่บริบทเปลี่ยนไป (ใช่หรือไม่) แต่ถึงอย่างนั้นคุณจะต้องตรวจสอบอย่างต่อเนื่องว่าดอทเชนที่มีลักษณะคล้ายกันนั้นอยู่ในบริบทเดียวกันหรือไม่ . สำหรับฉันแล้วดูเหมือนว่าในขณะที่วิธีการผูกมัดแบบผิวเผินจะสร้างโค้ดที่อ่านได้ แต่การโหลดมากเกินไปความหมายของเครื่องหมายจุดจะส่งผลให้เกิดความสับสนมากขึ้นเท่านั้น เมื่อฉันไม่พิจารณาตัวเองเป็นกูรูการเขียนโปรแกรมฉันถือว่าความผิดนั้นเป็นของฉัน ดังนั้นสิ่งที่ฉันหายไป? ฉันเข้าใจวิธีการผูกมัดอย่างผิดหรือเปล่า? มีบางกรณีที่วิธีการผูกมัดที่ดีเป็นพิเศษหรือบางกรณีที่แย่มากโดยเฉพาะ? Sidenote: ฉันเข้าใจว่าคำถามนี้สามารถอ่านได้ในฐานะที่เป็นข้อความแสดงความคิดเห็นที่หลอกลวงว่าเป็นคำถาม อย่างไรก็ตามมันไม่ใช่ - ฉันต้องการเข้าใจอย่างแท้จริงว่าทำไมการผูกมัดถือเป็นแนวปฏิบัติที่ดีและฉันจะไปผิดที่โดยคิดว่ามันจะทำลายสัญกรณ์เชิงวัตถุโดยธรรมชาติ

12
การสืบทอดกับการรวม [ปิด]
ตามที่เป็นอยู่ในปัจจุบันคำถามนี้ไม่เหมาะสำหรับรูปแบบคำถาม & คำตอบของเรา เราคาดหวังคำตอบที่จะได้รับการสนับสนุนจากข้อเท็จจริงการอ้างอิงหรือความเชี่ยวชาญ แต่คำถามนี้อาจเรียกร้องให้มีการอภิปรายโต้แย้งโต้แย้งหรือการอภิปรายเพิ่มเติม หากคุณรู้สึกว่าคำถามนี้สามารถปรับปรุงและเปิดใหม่ได้โปรดไปที่ศูนย์ช่วยเหลือเพื่อขอคำแนะนำ ปิดให้บริการใน8 ปีที่ผ่านมา มีโรงเรียนคิดสองแห่งเกี่ยวกับวิธีการขยายปรับปรุงและนำโค้ดกลับมาใช้ใหม่ในระบบเชิงวัตถุ: การสืบทอด: ขยายการทำงานของคลาสโดยการสร้างคลาสย่อย แทนที่สมาชิก superclass ในคลาสย่อยเพื่อมอบฟังก์ชันการทำงานใหม่ สร้างเมธอด abstract / virtual เพื่อบังคับคลาสย่อยให้ "fill-in-the-blanks" เมื่อซูเปอร์คลาสต้องการอินเตอร์เฟสเฉพาะ แต่ไม่เชื่อเรื่องการใช้งาน การรวม: สร้างฟังก์ชั่นใหม่โดยนำคลาสอื่น ๆ มารวมเข้าด้วยกันในคลาสใหม่ แนบอินเตอร์เฟสทั่วไปเข้ากับคลาสใหม่นี้เพื่อการทำงานร่วมกันกับรหัสอื่น ประโยชน์ต้นทุนและผลที่ตามมาของแต่ละประเภทคืออะไร มีทางเลือกอื่นหรือไม่? ฉันเห็นการอภิปรายนี้เกิดขึ้นเป็นประจำ แต่ฉันไม่คิดว่ามันถูกถามใน Stack Overflow เลย (แม้ว่าจะมีการสนทนาที่เกี่ยวข้อง) นอกจากนี้ยังมีการขาดผลลัพธ์ที่ดีของ Google อย่างน่าประหลาดใจ

14
'การมีเพศสัมพันธ์ต่ำและการรวมกลุ่มสูง' หมายถึงอะไร
low in coupling and high in cohesionฉันมีปัญหาในการทำความเข้าใจคำสั่ง ฉัน googled และอ่านมากเกี่ยวกับเรื่องนี้ แต่ก็ยังพบว่ามันยากที่จะเข้าใจ สิ่งที่ฉันเข้าใจคือHigh cohesionวิธีการที่เราควรมีคลาสที่มีความเชี่ยวชาญในการทำหน้าที่เฉพาะ หวังว่าถูกต้องหรือไม่ เช่นเดียวกับระดับการตรวจสอบบัตรเครดิตซึ่งมีความเชี่ยวชาญในการตรวจสอบบัตรเครดิตเท่านั้น และยังไม่เข้าใจว่า Coupling ต่ำหมายถึงอะไร
151 oop  ooad 

4
แทนที่เมธอดแอ็ตทริบิวต์ ActiveRecord
ตัวอย่างของสิ่งที่ฉันพูดถึง: class Person < ActiveRecord::Base def name=(name) super(name.capitalize) end def name super().downcase # not sure why you'd do this; this is just an example end end ดูเหมือนว่าจะใช้งานได้ แต่ฉันเพิ่งอ่านหัวข้อเกี่ยวกับวิธีการแทนที่คุณลักษณะในActiveRecord :: Base docsและแนะนำให้ใช้read_attributeและwrite_attributeวิธีการ ฉันคิดว่าต้องมีบางอย่างผิดปกติกับสิ่งที่ฉันทำในตัวอย่างด้านบน มิฉะนั้นเหตุใดพวกเขาจึงอวยพรวิธีเหล่านี้ในฐานะ "วิธีที่ถูกต้อง" เพื่อแทนที่วิธีการของแอตทริบิวต์ พวกเขายังบังคับสำนวนที่ขี้เหร่มากดังนั้นต้องมีเหตุผลที่ดี ... คำถามจริงของฉัน: มีบางอย่างผิดปกติกับตัวอย่างนี้หรือไม่?


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