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

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

6
คิดอย่างไรกับการเป็นโปรแกรมเมอร์ C หลังจากที่มีอคติกับภาษา OOP [ปิด]
ก่อนหน้านี้ฉันใช้ภาษาเขียนโปรแกรมเชิงวัตถุเท่านั้น (C ++, Ruby, Python, PHP) และตอนนี้ฉันเรียนรู้ C. ฉันพบว่ามันยากที่จะหาวิธีที่เหมาะสมในการทำสิ่งต่าง ๆ ในภาษาโดยไม่มีแนวคิดเรื่อง 'วัตถุ'. ฉันรู้ว่ามันเป็นไปได้ที่จะใช้กระบวนทัศน์ OOP ใน C แต่ฉันต้องการเรียนรู้วิธีการ C - สำนวน เมื่อแก้ปัญหาการเขียนโปรแกรมสิ่งแรกที่ฉันทำคือการจินตนาการวัตถุที่จะแก้ปัญหา ฉันจะแทนที่ขั้นตอนใดได้บ้างเมื่อใช้กระบวนทัศน์การเขียนโปรแกรมที่ไม่ใช่ OOP Imperative

5
บันทึกวัตถุด้วยวิธีการของตัวเองหรือผ่านชั้นเรียนอื่นได้หรือไม่
ถ้าฉันต้องการที่จะบันทึกและดึงวัตถุฉันควรสร้างคลาสอื่นเพื่อจัดการกับมันหรือมันจะดีกว่าที่จะทำในชั้นเรียนของตัวเอง? หรืออาจจะผสมทั้งสองอย่าง? ข้อเสนอแนะใดบ้างตามกระบวนทัศน์ของ OOD ตัวอย่างเช่น Class Student { public string Name {set; get;} .... public bool Save() { SqlConnection con = ... // Save the class in the db } public bool Retrieve() { // search the db for the student and fill the attributes } public List<Student> RetrieveAllStudents() { …

6
ทำไม“ การมีเพศสัมพันธ์อย่างแน่นหนาระหว่างฟังก์ชั่นและข้อมูล” ไม่ดี?
ฉันพบข้อความนี้ใน " ความสุขของ Clojure " บนหน้า 32 แต่มีบางคนพูดสิ่งเดียวกันกับฉันในมื้อค่ำเมื่อสัปดาห์ที่แล้วและฉันก็ได้ยินที่อื่นเช่นกัน: [A] ข้อเสียของการเขียนโปรแกรมเชิงวัตถุคือการมีเพศสัมพันธ์อย่างแน่นหนาระหว่างฟังก์ชั่นและข้อมูล ฉันเข้าใจว่าเหตุใดการเชื่อมต่อที่ไม่จำเป็นจึงไม่ดีในแอปพลิเคชัน นอกจากนี้ฉันรู้สึกสบายใจที่จะบอกว่าควรหลีกเลี่ยงสถานะและการสืบทอดที่ไม่แน่นอนแม้ในการเขียนโปรแกรมเชิงวัตถุ แต่ฉันล้มเหลวที่จะเห็นว่าทำไมการติดฟังก์ชั่นในชั้นเรียนจึงไม่ดีอย่างแท้จริง ฉันหมายถึงการเพิ่มฟังก์ชั่นในชั้นเรียนดูเหมือนว่าจะติดแท็กเมลใน Gmail หรือติดไฟล์ในโฟลเดอร์ เป็นเทคนิคขององค์กรที่ช่วยให้คุณค้นพบอีกครั้ง คุณเลือกเกณฑ์บางอย่างจากนั้นรวบรวมสิ่งต่าง ๆ เข้าด้วยกัน ก่อน OOP โปรแกรมของเรามีวิธีการมากมายในไฟล์ ฉันหมายความว่าคุณต้องใส่ฟังก์ชั่นบางแห่ง ทำไมไม่จัดระเบียบพวกเขา? หากนี่เป็นการโจมตีแบบ veiled ในประเภททำไมพวกเขาถึงไม่พูดว่าการ จำกัด ประเภทของอินพุตและเอาต์พุตไปยังฟังก์ชันนั้นผิด ฉันไม่แน่ใจว่าฉันจะเห็นด้วยกับเรื่องนี้หรือไม่ แต่อย่างน้อยฉันก็คุ้นเคยกับข้อโต้แย้งอย่างมืออาชีพและความปลอดภัยในการพิมพ์ ฟังดูเป็นเรื่องที่ฉันกังวลเป็นส่วนใหญ่ แน่นอนว่าบางครั้งผู้คนเข้าใจผิดและวางการทำงานผิดประเภท แต่เมื่อเทียบกับข้อผิดพลาดอื่น ๆ ดูเหมือนว่าจะเป็นความไม่สะดวกเล็กน้อย ดังนั้น Clojure มีเนมสเปซ การผสานฟังก์ชันกับคลาสใน OOP แตกต่างจากการผสานฟังก์ชันในเนมสเปซใน Clojure ได้อย่างไรและทำไมมันจึงไม่ดี โปรดจำไว้ว่าฟังก์ชั่นในชั้นเรียนไม่จำเป็นต้องทำงานกับสมาชิกของคลาสนั้นเสมอไป ดูที่ java.lang.StringBuilder - ทำงานกับประเภทการอ้างอิงใด …

7
ฉันจะทำให้ความคืบหน้าของฉันได้รับการตรวจสอบในฐานะนักพัฒนาจูเนียร์เดี่ยวได้อย่างไร [ปิด]
ฉันกำลังทำงานให้กับ บริษัท 2 คนในฐานะผู้พัฒนาหลักเดี่ยว เจ้านายของฉันรับลูกค้าสร้างแม่แบบการออกแบบ png และมอบให้ฉัน ระบบนี้ใช้งานได้ดีและฉันสนุกกับมันมาก ประเภทของโครงการที่ฉันทำมีไว้สำหรับธุรกิจขนาดเล็ก - ขนาดกลางและพวกเขามักต้องการระบบ CMS พัฒนาตั้งแต่เริ่มต้นฉันจะสร้างแบ็กเอนด์ที่กำหนดเองสำหรับลูกค้าเพื่อเพิ่ม / แก้ไข / ลบหมวดหมู่แท็กผลิตภัณฑ์ ฯลฯ แล้วส่งออกไปยังส่วนหน้าตามเทมเพลตการออกแบบที่มอบให้ฉัน เมื่อเวลาผ่านไปโครงการต่างๆก็มีความซับซ้อนเพิ่มขึ้นพร้อมกับตะกร้าสินค้า / คุณลักษณะการสั่งซื้อและคุณลักษณะประเภทอีคอมเมิร์ซทั่วไปอื่น ๆ อีกครั้งระบบนี้ทำงานได้ดีและฉันสนุกกับมันจริงๆ ปัญหาของฉันคือการพัฒนาตนเองในฐานะโปรแกรมเมอร์ ฉันใช้เวลาว่างอ่านบล็อกการเขียนโปรแกรมตรวจสอบผ่าน stackexchange อ่านหนังสือแนะนำการเขียนโปรแกรม (ปัจจุบันใน ' The Pragmatic Programmer ' ดีมากจนถึงตอนนี้) ฝึกสมอง ( lumosity.comและปัญหาคณิตศาสตร์khanacademy ) ทำสิ่งต่างๆมากมาย ของการออกกำลังกายและกิจกรรมประเภทการพัฒนาส่วนบุคคลอื่น ๆ ฉันไม่สามารถช่วย แต่รู้สึกว่าฉันกำลังพลาดข้อเสนอแนะวิจารณ์ เจ้านายของฉันยอดเยี่ยมและไม่เคยหยุดยั้งการยกย่องในเรื่องที่เกี่ยวกับงานของฉัน แต่เขาก็โชคร้ายที่ต้องยุ่งกับการตรวจสอบรหัสของฉันหรือพูดตามตรงฉันไม่คิดว่ามันเป็นหนึ่งในความเชี่ยวชาญของเขา . ฉันต้องการที่จะรู้ว่าสิ่งที่ฉันทำผิดและสิ่งที่ฉันทำถูกต้อง ฉันควรจะใส่ตรรกะจำนวนมากนั้นลงในคอนโทรลเลอร์หรือไม่ฉันกำลังปรับเปลี่ยนรหัสของฉันให้มากพอ ฯลฯ …

5
ผ่าน ID หรือวัตถุ?
เมื่อระบุวิธีตรรกะทางธุรกิจเพื่อรับเอนทิตีโดเมนพารามิเตอร์ควรยอมรับวัตถุหรือ ID หรือไม่ ตัวอย่างเช่นเราควรทำสิ่งนี้: public Foo GetItem(int id) {} หรือสิ่งนี้: public Foo GetItem(Foo foo) {} ฉันเชื่อในการส่งวัตถุไปรอบ ๆ อย่างครบถ้วน แต่สิ่งที่เกี่ยวกับกรณีนี้ที่เราได้รับวัตถุและเรารู้ ID เท่านั้น ผู้โทรควรสร้าง Foo ที่ว่างเปล่าและตั้ง ID หรือควรส่ง ID ไปที่เมธอด? เนื่องจาก Foo ที่เข้ามาจะว่างเปล่ายกเว้น ID ฉันไม่เห็นประโยชน์ของผู้โทรที่ต้องสร้าง Foo และตั้ง ID เมื่อมันสามารถส่ง ID ไปยังวิธี GetItem ()

11
คลาสย่อยของตัวสร้างเท่านั้น: นี่เป็นรูปแบบการต่อต้านหรือไม่
ฉันมีการพูดคุยกับเพื่อนร่วมงานและท้ายที่สุดเราก็มีสัญชาติญาณที่ขัดแย้งกันเกี่ยวกับวัตถุประสงค์ของการทำคลาสย่อย สัญชาตญาณของฉันคือถ้าฟังก์ชั่นหลักของคลาสย่อยแสดงค่าที่เป็นไปได้ที่ จำกัด ของพาเรนต์มันก็คงไม่ควรเป็นคลาสย่อย เขาแย้งกับสัญชาตญาณตรงข้ามว่าคลาสย่อยหมายถึงวัตถุที่เป็น "เฉพาะ" มากกว่าดังนั้นความสัมพันธ์คลาสย่อยจึงเหมาะสมกว่า เพื่อให้สัญชาตญาณของฉันเป็นรูปธรรมมากขึ้นฉันคิดว่าถ้าฉันมี subclass ที่ขยายคลาสแม่ แต่รหัสเดียวที่แทนที่ subclass เป็นตัวสร้าง (ใช่ฉันรู้ว่าตัวสร้างไม่ได้โดยทั่วไป "แทนที่", ทนกับฉัน) แล้ว สิ่งที่จำเป็นจริงๆคือวิธีการช่วยเหลือ ตัวอย่างเช่นลองพิจารณาชั้นเรียนชีวิตจริงนี้: public class DataHelperBuilder { public string DatabaseEngine { get; set; } public string ConnectionString { get; set; } public DataHelperBuilder(string databaseEngine, string connectionString) { DatabaseEngine = databaseEngine; ConnectionString = connectionString; } …

9
เมื่อเขียนโค้ดเชิงวัตถุฉันควรทำตามรูปแบบการออกแบบหรือไม่
มีรูปแบบการออกแบบที่เป็นไปได้สำหรับโปรแกรมเชิงวัตถุหรือไม่? ฉันถามนี้เพราะเมื่อเร็ว ๆ นี้ผมเห็นการดำเนินการระดับกับDoor Lockมันเป็นส่วนหนึ่งของการทดสอบและคำตอบบอกว่ารหัสเป็นไปตามรูปแบบวัตถุ Null: class Lock { public: virtual void close() = 0; virtual void open() = 0; virtual bool is_open() const = 0; virtual ~Lock() { } }; class DummyLock : public Lock { private: DummyLock(); DummyLock(const DummyLock&) = delete; DummyLock& operator=(const DummyLock&) = delete; private: void …

11
คลาส / เมธอดนามธรรมล้าสมัยหรือไม่?
ฉันเคยสร้างคลาส / วิธีการที่เป็นนามธรรมจำนวนมาก จากนั้นฉันก็เริ่มใช้อินเตอร์เฟส ตอนนี้ฉันไม่แน่ใจว่าอินเทอร์เฟซไม่ทำให้คลาสนามธรรมล้าสมัยหรือไม่ คุณต้องการคลาสที่เป็นนามธรรมอย่างสมบูรณ์หรือไม่ สร้างส่วนต่อประสานแทน คุณต้องการคลาสนามธรรมที่มีการใช้งานบางอย่างหรือไม่ สร้างอินเตอร์เฟสสร้างคลาส รับชั้นเรียนใช้อินเตอร์เฟซ ประโยชน์เพิ่มเติมคือบางคลาสอาจไม่ต้องการคลาสพาเรนต์ แต่จะใช้อินเตอร์เฟส ดังนั้นคลาส / เมธอด abstract ล้าสมัยหรือไม่?

17
ฉันจะรู้สึกมั่นใจมากขึ้นเกี่ยวกับทักษะการเขียนโปรแกรมของฉันได้อย่างไร [ปิด]
การเขียนโปรแกรมไม่ใช่คนต่างด้าวสำหรับฉัน ฉันเริ่มทำมาร์กอัพ (HTML ตอนนี้โปรดอย่าหัวเราะเยาะฉัน) เมื่อฉันอายุได้ 12 ปีและ BASIC เล็กน้อยเมื่อฉันอายุ 13 (ฉันรู้มากเกี่ยวกับ Flowcharts, Pseudocodes ณ จุดนี้) แต่แล้วฉันก็ถูกตักเตือนเป็น ชีววิทยาในโรงเรียนมัธยมและด้วยเหตุนี้จึงพลาดความรู้ด้านการเขียนโปรแกรม "ของจริง" ของภาษาเช่น C, Java, etcetera ฉันใช้ CS กับ UG BE ของฉัน (คล้ายกับ BS แต่เป็นไปตามทฤษฎีมากกว่า) ฉันเรียน C & C ++ (ในระดับที่น้อยกว่า) ด้วยตัวเอง (ศาสตราจารย์ของฉันเจ็บปวดมากและชั้นเรียนเต็มไปด้วย code-jocks (ที่เรียนมาแล้วในโรงเรียนและด้วยเหตุนี้ไม่สนใจห้องเรียน) ให้ปุถุชนน้อยกว่าอย่างฉันให้ความสนใจกับชั้นเรียนด้วย) และสามารถชักนำโปรแกรมการบวกหรือการคูณที่ยอดเยี่ยม (อันที่ตอนนี้แม้แต่ผู้ทำสวนเองก็ใจดีด้วย) ปัญหาหลักของฉันคือฉันรู้สึกไม่ดีและบีบคอด้วยทักษะการเขียนโปรแกรมที่ จำกัด ของฉันและดูหมิ่นโดย code-jocks (เชื่อฉันสิฉันเจอเว็บไซต์นี้มานานแล้ว แต่ตอนนี้อาจสร้างความกล้าหาญที่จะโพสต์จริง …

5
การกำหนดว่าวิธีใดสามารถแทนที่ข้อผูกพันที่แข็งแกร่งกว่าการกำหนดวิธีการที่สามารถเรียกได้
จาก: http://www.artima.com/lejava/articles/designprinciples4.html Erich Gamma: ฉันยังคงคิดว่ามันเป็นความจริงแม้หลังจากผ่านไปสิบปี การสืบทอดเป็นวิธีที่ยอดเยี่ยมในการเปลี่ยนพฤติกรรม แต่เรารู้ว่ามันเปราะบางเนื่องจากคลาสย่อยสามารถตั้งสมมติฐานเกี่ยวกับบริบทที่มีการเรียกเมธอดแทนที่ได้ง่าย มีการเชื่อมต่ออย่างแน่นหนาระหว่างคลาสฐานและคลาสย่อยเนื่องจากบริบทโดยปริยายซึ่งโค้ดคลาสย่อยที่ฉันเสียบเข้าจะถูกเรียก องค์ประกอบมีคุณสมบัติที่ดีกว่า การมีเพศสัมพันธ์จะลดลงเพียงแค่มีสิ่งเล็ก ๆ ที่คุณเสียบเข้าไปกับสิ่งที่ใหญ่กว่าและวัตถุที่ใหญ่กว่าก็เรียกวัตถุที่เล็กกว่ากลับมา จากมุมมองของ API ที่กำหนดว่าวิธีการใด ๆ ที่สามารถแทนที่ได้คือความมุ่งมั่นที่แข็งแกร่งกว่าการกำหนดวิธีการที่สามารถเรียกได้ ฉันไม่เข้าใจสิ่งที่เขาหมายถึง ใครช่วยอธิบายหน่อยได้ไหม

2
ทำไมเมธอดที่รับพารามิเตอร์ไม่ จำกัด จำนวนมักกำหนดโอเวอร์โหลดด้วยพารามิเตอร์ที่น้อยลง
ตัวอย่างเช่นSystem.IO.Path.Combineวิธีการใน. NET มีการโอเวอร์โหลดดังต่อไปนี้: Combine(params String[]) Combine(String, String) Combine(String, String, String) Combine(String, String, String, String) จุดสามจุดสุดท้ายคืออะไร? คนแรกจะครอบคลุมพวกเขาทั้งหมดราวกับว่าคุณดูอย่างใกล้ชิดมันใช้paramsคำหลัก อาร์กิวเมนต์ของความเข้ากันได้ย้อนหลังจะครอบคลุมเฉพาะCombine(String, String)ตัวแปรเนื่องจากเป็นรุ่นเดียวจนถึง. NET 4

8
ความสามารถของวัตถุควรถูกระบุโดยอินเทอร์เฟซที่ใช้หรือไม่
isโอเปอเรเตอร์ของ C # และโอเปอเรเตอร์ของ Java instanceofช่วยให้คุณสามารถแยกสาขาบนอินเทอร์เฟซได้ เหมาะสมหรือไม่ที่จะใช้คุณสมบัตินี้ในการแยกสาขาในระดับสูงตามความสามารถที่อินเตอร์เฟสจัดให้? หรือคลาสฐานควรให้ตัวแปรบูลีนเพื่อให้อินเทอร์เฟซเพื่ออธิบายความสามารถของวัตถุที่มี? ตัวอย่าง: if (account is IResetsPassword) ((IResetsPassword)account).ResetPassword(); else Print("Not allowed to reset password with this account type!"); เมื่อเทียบกับ if (account.CanResetPassword) ((IResetsPassword)account).ResetPassword(); else Print("Not allowed to reset password with this account type!"); มีข้อผิดพลาดใด ๆ ในการใช้งานส่วนต่อประสานเพื่อระบุความสามารถหรือไม่? ตัวอย่างนี้เป็นเพียงตัวอย่างเท่านั้น ฉันสงสัยเกี่ยวกับแอปพลิเคชันทั่วไปที่มากขึ้น

8
เมื่อไหร่ที่เราจะใช้การเขียนโปรแกรมเชิงวัตถุ? [ปิด]
ฉันกำลังเขียนโปรแกรมใน Python ซึ่งโดยทั่วไปจะจัดการกับสตริงและฉันสงสัยว่าฉันควรทำโดยใช้หลักการ OOP หรือไม่ ลูกค้าไม่บอกผมว่าเขาไม่ได้ดูแลเกี่ยวกับรหัสที่เขาต้องการเพียงแค่สิ่งที่ทำ ฉันรู้ว่ารหัสเชิงวัตถุไม่ได้โดยการทำความสะอาดคำนิยามและในทางกลับกันโค้ดที่ไม่ใช่ OO ไม่ได้เป็นคำจำกัดความที่เสแสร้ง คำถามที่ฉันถามอาจมีพื้นฐานจากความคิดเห็นไม่มากก็น้อย แต่อาจมีกฎบางอย่างที่ฉันไม่ทราบ ข้อมูลเพิ่มเติมเกี่ยวกับสิ่งที่ต้องทำ: แยก.csvไฟล์และประมวลผลข้อมูลตามไฟล์ปรับแต่ง (คอลัมน์อาจแตกต่างกัน - เช่นในจำนวนคอลัมน์หรือข้อมูลที่เก็บ) ใช้ข้อมูลที่ประมวลผลข้างต้นเพื่อสร้างข้อมูลที่จัดรูปแบบใหม่ที่กำหนดเอง (หรือหลายไฟล์ตามค่าข้างต้น) ใช้ข้อมูลที่จัดรูปแบบล่าสุดเพื่อสร้างไฟล์ XML แบ่งไฟล์ XML เป็นหลาย ๆ ไฟล์XMLตามเนื้อหา แอปพลิเคชันควรเป็นแบบ CLI มีสิ่งอื่น ๆ ที่แน่นอนเช่น: การบันทึกเหตุการณ์บางอย่างอาร์กิวเมนต์แยกวิเคราะห์ CLI และอื่น ๆ ตอนนี้มันไม่ได้เป็นแอพพลิเคชั่นขนาดใหญ่ / หนักและมันก็เกือบจะเสร็จสิ้นแล้ว แต่ในระหว่างกระบวนการพัฒนาทั้งหมดฉันก็ถามตัวเองว่าควรจะใช้ OOP หรือไม่ ดังนั้นคำถามของฉันคือ: คุณรู้จัก / ตัดสินใจว่าจะใช้ OOPในแอปพลิเคชันได้อย่างไร

5
เมื่อใดที่ฉันควรขยายคลาส Java Swing
ความเข้าใจในปัจจุบันของฉันเกี่ยวกับการใช้งานมรดกคือควรขยายชั้นเรียนเฉพาะเมื่อมีความสัมพันธ์แบบ IS-A หากคลาสพาเรนต์สามารถมีประเภทลูกที่เฉพาะเจาะจงเพิ่มเติมด้วยฟังก์ชันการทำงานที่แตกต่างกัน แต่จะแบ่งปันองค์ประกอบทั่วไปที่มีนามธรรมในผู้ปกครอง ฉันกำลังถามความเข้าใจนั้นเพราะสิ่งที่อาจารย์ Java ของฉันแนะนำให้เราทำ เขาแนะนำว่าสำหรับJSwingแอปพลิเคชันที่เรากำลังสร้างในชั้นเรียน หนึ่งควรขยายทุกJSwingชั้นเรียน ( JFrame, JButton, JTextBoxฯลฯ ) ในชั้นเรียนที่กำหนดเองแยกต่างหากและระบุ GUI การปรับแต่งที่เกี่ยวข้องในพวกเขา (เช่นขนาดส่วนประกอบฉลากส่วนประกอบ ฯลฯ ) จนถึงตอนนี้ดีมาก แต่เขาก็ยังแนะนำต่อไปว่า JButton ทุกคนควรมีคลาสแบบขยายที่กำหนดเองของตนเองแม้ว่าปัจจัยที่แตกต่างเท่านั้นคือฉลากของพวกเขา สำหรับเช่นหาก GUI มีสองปุ่มโอเคและยกเลิก เขาแนะนำให้ขยายเวลาดังต่อไปนี้: class OkayButton extends JButton{ MainUI mui; public OkayButton(MainUI mui) { setSize(80,60); setText("Okay"); this.mui = mui; mui.add(this); } } class CancelButton extends JButton{ …

5
เป็นวิธีปฏิบัติที่ดีในการสร้าง ClassCollection ของคลาสอื่นหรือไม่?
ให้บอกว่าฉันมีCarคลาส: public class Car { public string Engine { get; set; } public string Seat { get; set; } public string Tires { get; set; } } ให้บอกว่าเรากำลังสร้างระบบเกี่ยวกับที่จอดรถฉันจะใช้Carคลาสจำนวนมากดังนั้นเราจึงสร้างCarCollectionคลาสมันอาจมีวิธีการโฆษณาสองสามอย่างเช่นFindCarByModel: public class CarCollection { public List<Car> Cars { get; set; } public Car FindCarByModel(string model) { // code here return new Car(); …

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