การเขียนโปรแกรม OO มีความสำคัญเทียบเท่ากับการว่าจ้าง บริษัท หรือไม่ [ปิด]


55

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

OO สำคัญจริง ๆ ไหม ฉันยังมีการสัมภาษณ์งานเขียนโปรแกรมใน C และอีกครึ่งหนึ่งการสัมภาษณ์คือ OO

ในโลกแห่งความเป็นจริงการพัฒนาแอพพลิเคชั่นจริงการวางแนววัตถุมักจะถูกนำไปใช้หรือไม่? ฟีเจอร์สำคัญเช่น polymorphism ใช้ A LOT หรือไม่?

ฉันคิดว่าคำถามของฉันมาจากหนึ่งในจุดอ่อนของฉัน แม้ว่าฉันจะรู้เกี่ยวกับ OO แต่ดูเหมือนว่าฉันจะไม่สามารถรวมเข้ากับโปรแกรมของฉันได้


3
แม้ว่าทั้งหมดจะไม่สูญหายไป ตระหนักถึงการมีปัญหาเป็นขั้นตอนแรกที่จะแก้ไขให้ถูกต้อง :)
กิน Elysium

37
ฉันใช้เวลาหลายปีกว่าจะเข้าใจว่าทำไม OO เป็นแนวคิดที่มีประโยชน์ ฉันสามารถเข้าใจชิ้นส่วนทางเทคนิคทั้งหมด แต่ก็ไม่สามารถหาอะไรที่มีประโยชน์ ฉันเดาว่าหลายอย่างนั้นมาจากตัวอย่างที่โง่ ๆ ที่ฉันเคยแสดงกับสุนัขที่ขยายสัตว์เลี้ยงลูกด้วยนมที่ขยายสัตว์ ... สิ่งที่ลืมตาของฉันคือการมองรูปแบบการออกแบบ OO โดยเฉพาะผู้ฟัง (Observer aka) และรูปแบบกลยุทธ์
Mchl

1
ใช่แล้ว. อย่างสุจริต
quant_dev

6
ดูคำตอบของThorbjørn Ravn Andersen ในการเป็นโปรแกรมเมอร์ที่ดีคุณจำเป็นต้องรู้การออกแบบโมดูลและ API โปรแกรมเมอร์ไม่ทุกคนในอุตสาหกรรมนั้นดี แต่ใช้ OOP เป็นส่วนใหญ่ น่าเสียดายที่การรวมกันของ OOP และโค้ดที่ไม่ใช่โมดูลาร์และ API ที่ไม่ดีนั้นนำไปสู่ซอฟต์แวร์ที่มีคุณภาพต่ำและคุณจะเห็นรหัสประเภทนี้จำนวนมากในที่ทำงาน หากคุณไม่ได้เขียนโค้ดจำนวนมากในเวลาว่างของคุณคุณอาจไม่รู้จัก OOP "ชีวิตจริง" มากนัก ตกลงคุณไม่ได้อยู่คนเดียวในตำแหน่งนี้
Joh

1
โฮใช่เขาทำได้ และเชื่อฉันเถอะถ้าคุณมีความเข้าใจแบบเดียวกันกับ OOP ที่คุณมีเมื่อเรียนจบปริญญาโทคุณคงไม่รู้อะไรเกี่ยวกับ OOP
deadalnix

คำตอบ:


84

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

ช่วงเวลาสั้น ๆ นี้ไม่เพียงพอที่จะทำให้วัตถุประสงค์ของ OOP ชัดเจนโดยเฉพาะถ้าคนในโครงการเป็นผู้เริ่มต้น แต่การยึดติดกับ modellisation เป็นสิ่งสำคัญสำหรับโครงการขนาดใหญ่ฉันจะบอกว่า> 50,000 บรรทัดของรหัส OOP ไม่ได้เป็นเพียงทางออกเดียว แต่เป็นวิธีที่ใช้กันอย่างแพร่หลายในอุตสาหกรรม

นี่คือสาเหตุที่ผู้คนต้องการให้คุณรู้จัก OOP

ฉันจะเพิ่มโดย exprience ที่โปรแกรมเมอร์จูเนียร์เกือบทั้งหมดมีข้อบกพร่องร้ายแรงใน modellisation และ OOP ส่วนใหญ่พวกเขารู้วิธีการเขียนชั้นเรียนสืบทอดจากพวกเขาและสิ่งพื้นฐานเช่นนั้น แต่พวกเขาไม่คิดว่าใน "OOP" และท้ายที่สุดใช้ผิดวัตถุประสงค์ นี่คือเหตุผลที่นายหน้าที่จริงจังจะมองความสามารถของคุณในโดเมน OOP

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

หากคุณยังไม่คิดว่า "OOP" ฉันขอแนะนำให้คุณอ่านหนังสือเกี่ยวกับมันและสมัครใน บริษัท ที่ไม่มีโครงการขนาดใหญ่จริงๆ เพื่อให้ OOP คุ้นเคยกับการทำงานที่มีประโยชน์สำหรับนายจ้างของคุณ (และตราบใดที่เขา / เธอให้เงินเดือนแก่คุณก็จะเป็นประโยชน์กับคุณเช่นกัน)

แก้ไข: ฮ่าและฉันจะเพิ่มว่าฉันได้เขียนรหัส OOP ใน C แม้ว่าจะไม่ใช่การใช้ C ทั่วไปมันเป็นไปได้ที่มีความรู้สูง คุณเพียงแค่สร้าง vtables ด้วยตนเอง

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


2
และใช่ .. ที่ฉันเขียนในความคิดเห็นก่อนหน้านี้ฉันคิดว่าฉันต้องทำงานในโครงการขนาดใหญ่เพื่อขอบคุณ OOP :)
เบียร์

5
คุณไม่จำเป็นต้องมี vtables เป็น OOP เพียงใช้structและฟังก์ชั่นที่ทำงานกับโครงสร้างนั้นใน C คือ OOP
edA-qa mort-ora-y

2
@ edA-qa mort-ora-y struct ไม่ได้ให้ฟังก์ชัน OOP แก่คุณ ความแตกต่าง? Inhéritance นั่นหมายถึงบางสิ่งสำหรับคุณหรือไม่ ตกลงดังนั้นคุณจะใช้ฟังก์ชั่นเสมือนจริงโดยไม่ต้อง vtable อย่างไร
deadalnix

2
@deadalnix: คุณใช้มันในแบบเดียวกับที่. NET และ Java ทำการสืบทอดหลาย ๆ คุณควรรู้ว่าคอมไพเลอร์ C ++ ตัวแรกไม่ได้คอมไพเลอร์เลยพวกเขาเป็นนักแปลที่ใช้รหัส C ++ และเปลี่ยนมันเป็นรหัส C ที่ถูกส่งไปยังคอมไพเลอร์ C Google "CFront"
gbjbaanb

3
Java และ; NET ไม่ได้ทำหลายสิ่งหลายอย่าง และใช่ C ++ สามารถแปลได้ใน C โดยอัตโนมัติ แต่สิ่งนี้ไม่เกี่ยวข้องกับปัญหาการใช้ vtable อย่างสมบูรณ์หรือไม่ ในความเป็นจริงคุณต้อง: คุณไม่สามารถใช้ฟังก์ชั่นเสมือนโดยไม่ต้อง vtable
deadalnix

38

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

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

ตัวอย่าง:

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

กล่าวอีกนัยหนึ่งการรู้เทคนิคมากมายเป็นสิ่งจำเป็นหากคุณต้องการทำงานกับซอฟต์แวร์ที่ไม่สำคัญไม่ว่าจะเป็นคนเดียวหรือกับคนอื่น ๆ


7
ฉันชอบที่คุณสร้างความแตกต่างระหว่าง modularity, API และ OO ฉันคิดว่ามีความเข้าใจผิดอย่างกว้างขวางในอุตสาหกรรมซอฟต์แวร์ที่ OO หมายถึงทุกสิ่งเหล่านี้
Joh

3
แม้การรู้ว่า OO นั้นไม่ได้เป็นข้อกำหนดที่ยาก แต่กระบวนทัศน์ด้านกระบวนงานและการใช้งานก็เพียงพอในบางพื้นที่ (C หรือ Haskell) คุณยังต้องเรียนรู้การออกแบบโมดูลและ API
Raynos

@Raynos ใน C คุณมีพอยน์เตอร์ของฟังก์ชั่นที่อนุญาตให้คุณทำอย่างชัดเจนว่า OO ทำอะไรในตัว ในทำนองเดียวกัน Haskell ใช้การจับคู่รูปแบบเพื่อทำสิ่งที่คอมไพเลอร์ทำใน Java อย่างชัดเจน

@ThorbjornRavnAndersen มันเป็นช่องเล็ก ๆ น้อย ๆ ในการเขียนสไตล์ OO C และ Haskell ฉันแค่บอกว่าการใช้โค้ดซ้ำสามารถทำได้ในกระบวนทัศน์ขั้นตอนและการทำงาน
Raynos

3
@ มาธาปิกฉันไม่ได้บอกว่าควรเขียน OO haskell (หรือว่ามันมีอยู่จริง) ฉันกำลังบอกว่าคุณไม่จำเป็นต้องรู้ OO มีวิธีอื่น ๆ ในการจัดการกับความซับซ้อน (FP)
Raynos

14

ใช่เป็นหลักเพราะบางทีสองแพลตฟอร์มการพัฒนาที่เป็นที่นิยมที่สุดที่ใช้ในการพัฒนาเชิงพาณิชย์ (Java และ. NET) เป็นเชิงวัตถุและนั่นหมายความว่าใช่ OO มีการใช้งานจำนวนมาก (รวมถึงความหลากหลายรูปแบบการสืบทอดและทุกอย่าง)

บริษัท ไม่ได้ใส่ใจเป็นพิเศษเกี่ยวกับการวางแนววัตถุในฐานะเทคโนโลยี - นี่ไม่ใช่สิ่งที่เป็นอุดมการณ์พวกเขาสนใจคนที่สามารถพัฒนาวิธีการแก้ปัญหาของพวกเขาในแนวทางที่สอดคล้องกับกลยุทธ์ด้านไอทีของพวกเขา

แต่ฉันจะไม่กังวลมากเกินไปเกี่ยวกับความรู้สึกว่ามันเป็นจุดอ่อน ผู้คนส่วนใหญ่ในโลกธุรกิจไม่มองว่าโปรแกรมเมอร์ออกจากมหาวิทยาลัย (ในระดับใด) เป็นบทความที่เสร็จสมบูรณ์โดยไม่ดูหมิ่นการศึกษาของคุณ คุณยังมีเหลืออีกมากที่จะเรียนรู้และเป็นที่เข้าใจ (บริษัท อาจจะดีกว่านักเรียน)


2
ต้องโทรหาคุณเกี่ยวกับ บริษัท ที่ 'ไม่สนใจ' เกี่ยวกับ OO - บริษัท ที่ดีต้องใส่ใจกับรหัสที่สามารถนำกลับมาใช้ใหม่ / บำรุงรักษาได้และรูปแบบ OO เป็นวิธีที่ได้รับการยอมรับในการทำเช่นนี้
HorusKol

1
@HorusKol - พวกเขาทำ แต่ถึงกระนั้น Perl, Cobol และ Visual Basic ก็ประสบความสำเร็จในเชิงพาณิชย์และ Smalltalk ไม่ได้ คุณเป็น บริษัท ที่ถูกต้องเช่นรหัสที่สามารถบำรุงรักษาได้ แต่มันไม่ใช่ข้อกำหนดที่แน่นอนพวกเขาจะให้น้ำหนักกับปัจจัยอื่น ๆ
Jon Hopkins

โคบอลได้อยู่ต่อหน้า OO ฉันไม่สามารถแสดงความคิดเห็นใน Smalltalk แต่ฉันคิดว่าจะต้องมีปัญหากับมันหากไม่ได้รับ
HorusKol

1
@HorusKol - จริง ๆ แล้ว Cobol และ OO มีอยู่ในเวลาเดียวกัน (ช่วงปลายยุค 50) แต่ถึงแม้ว่าเราจะสมมติว่า OO ไม่ได้เริ่มที่จะถือจนกว่า 70s หรือ 1980 (ถ้าคุณรอ C ++) เรื่องใหญ่สำหรับ บริษัท ทำไมมันไม่จับจนกระทั่งเมื่อปลาย 90s (กับ Java) คำตอบก็คือมีวิธีในการมีฐานรหัสที่สามารถบำรุงรักษาได้นอกเหนือจาก OO - บริษัท ต่าง ๆ ดูแลรหัสที่สามารถบำรุงรักษาได้ แต่มีมากกว่าหนึ่งวิธีในการสกินแมวและ OO ไม่ใช่วิธีแก้ปัญหาเดียว
Jon Hopkins

มันค่อนข้างแปลกที่จะเรียกว่าแพลตฟอร์ม OO เอง Clojure ไม่ใช่ OO Scala มีองค์ประกอบ OO บางอย่างที่ฉันเดา แต่ใช้ดีที่สุดในลักษณะการทำงาน F # เป็นข้อตกลงเดียวกัน การเขียนรหัส OO ใน F # นั้นสกปรก
sara

7

ในชีวิตจริงการเขียนโปรแกรมชีวิตจริงนั้นแตกต่างจากในทางทฤษฎี

ใช่ถ้าคุณรักษากระบวนทัศน์ของ OO ให้คงอยู่และอยู่ในใจคุณเสมอคุณสามารถทำได้ดีกว่าในการเขียนโค้ดที่สามารถจัดการเข้าใจและขยายได้ง่าย

น่าเสียดายที่โลกแห่งความจริงมีสิ่งนี้:

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

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

OO ในชีวิตจริงมาช้า ช่วยถ้าคุณอ่านต่อไปและปรับปรุงอยู่ตลอดเวลา


6

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


ดีใจที่ฉันไม่ใช่คนเดียว! ขอบคุณ .. ฉันจะดูหนังสือเล่มนั้น :)
เบียร์

6

แม้สำหรับงานบางอย่างใน C คุณอาจจำเป็นต้องรู้การออกแบบเชิงวัตถุ (และอาจจะดีกว่านั้นถ้าคอมไพเลอร์ของคุณทำเพื่อคุณ) ดังที่เห็นได้จากบทความชุดล่าสุดเกี่ยวกับการออกแบบเชิงวัตถุในเคอร์เนล Linux ( ตอนที่ 1 , ตอนที่ 2 )

GTK + ยังใช้รูปแบบการออกแบบเชิงวัตถุจำนวนมาก


4

ฉันต้องแสดงความไม่เห็นด้วยกับความคิดนี้ว่า OO คือทุกสิ่ง - ใคร ๆ ก็บอกได้ว่า OO ช่วยให้คุณสร้างเมืองได้ แต่โปรแกรมการดำเนินการเป็นอิฐ

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

-findBestMove
-makeBestMove
-waitForPlayerInput

แต่บางคนต้องเขียนโค้ดที่อยู่เบื้องหลัง -findBestMove และคุณสามารถมั่นใจได้ว่ามันไม่ใช่แค่นี้:

foreach $move (@moves){
    $bestMove = ($move > $bestMove ? $move : $bestMove)
}
return $bestMove

ในทางกลับกันหากคุณไม่ทราบวิธีการอ่านรหัส OO ให้กังวล เพราะคุณสามารถมั่นใจได้ (เกือบ) ว่ารหัสของคุณจะยุ่งกับวัตถุบางอย่าง นอกจากว่าคุณจะทำงานในรุ่นเก่าของ Fortran จาก 12,000 vars ทั่วโลกและ 1200 โมดูล "โมดูล" ฉันยังคงรักษา


4

Jon Hopkins เขียนว่า:

ใช่เป็นหลักเพราะบางทีสองแพลตฟอร์มการพัฒนาที่เป็นที่นิยมที่สุดที่ใช้ในการพัฒนาเชิงพาณิชย์ (Java และ. NET) เป็นเชิงวัตถุและนั่นหมายความว่าใช่ OO มีการใช้งานจำนวนมาก (รวมถึงความหลากหลายรูปแบบการสืบทอดและทุกอย่าง)

ซึ่งค่อนข้างสวยสิ่งที่ฉันจะพูด แต่มันไม่ใช่แค่ Java และ. Net, C ++ มีอยู่ทั่วไป Objective-C อยู่เหนือ OSX เด็ก ๆ ทุกคนกำลังทำ Ruby หรือ Python และทุกสิ่งเหล่านี้และอีกมากมาย มากขึ้นมีความสำคัญกับการวางแนววัตถุ ภาษาที่ใหม่กว่าจำนวนมากเป็นแบบหลายจุดดังนั้นบางอย่างเช่น F # เป็นภาษาที่ใช้งานได้เป็นหลัก แต่ก็รองรับการวางแนววัตถุ มันมีอยู่ทั่วไปและอย่างน้อยความเข้าใจก็มีประโยชน์มาก อย่ากังวลมากเกินไปเมื่อเรียนจบหลักสูตรมหาวิทยาลัยหมายความว่าคุณพร้อมที่จะเริ่มเรียนรู้เกี่ยวกับการพัฒนารหัสในโลกแห่งความจริง :)


3

ฉันได้เขียนโปรแกรมมานานแล้วและฉันพบว่าแนวคิดของ OO นั้นมีประโยชน์แม้ว่าการเขียนโปรแกรมใน C - แม้ว่าจะผ่านการทดสอบแล้วก็ตามฉันก็อาจจะไม่สามารถอธิบายแนวคิดเหล่านั้นได้ในทุกรายละเอียด ณ จุดหนึ่งฉันยังสร้างภาษา OO แม้ว่าจะเป็นพื้นฐานเพื่อให้ได้แนวคิดของฉันและค้นหาความเพลิดเพลินใน OO จากมุมมองใหม่

BTW, C ++ ทำให้ OO มีขนาดใหญ่และน่าเกลียดในขณะที่ Objective C ทำถูกต้อง

เกี่ยวกับการสัมภาษณ์พวกเขาได้กลายเป็นโชว์สยองขวัญจากทั้งสองด้านของตาราง ผู้ให้สัมภาษณ์ส่วนใหญ่คลั่งไคล้พวกเขามาก ผู้จัดการการจ้างงานส่วนใหญ่ประหลาดใจด้วยจำนวนคนที่ล้มเหลวแม้แต่การทดสอบการเขียนโปรแกรมขั้นพื้นฐานมาก

ที่กล่าวว่ามีถุงฉีดขนาดใหญ่ที่ทำงานอยู่ในอุตสาหกรรมซอฟต์แวร์ในขณะนี้ที่รู้ว่าไม่มีอะไรและยังคาดหวังโลกจากพนักงานที่คาดหวัง


C ++ เป็นภาษาแบบหลายกระบวนทัศน์ แต่จัดการ OO ได้ดีทีเดียว .. ไม่ได้?
Nikko

1
ฉันจะบอกว่า C ++ ช่วยให้คุณมีความสามารถในการทำสิ่งที่น่าเกลียดมาก หากทำอย่างถูกต้องความงามคือความเรียบง่าย
Martin York

การข้ามข้อมูลพื้นฐานจะทำให้เกิดความยุ่งเหยิงอย่างมาก C ++ มีพื้นฐานจำนวนมากที่คุณต้องเข้าใจ นี่คือเหตุผลที่เป็นไปได้ที่จะใช้ C ++ สำหรับโปรแกรมขนาดใหญ่ มันจำเป็น.
tp1

@Ponk: BTW, C ++ ทำให้เกิดความยุ่งเหยิงอย่างมากกับ OO ในขณะที่ Objective C ทำถูกต้อง - ฉันไม่ได้ลอง Objective C ดังนั้นฉันไม่มีเหตุผลที่จะสงสัยคุณ แต่ฉันจะหาข้อโต้แย้งที่ละเอียดและน่าเชื่อถือสำหรับเรื่องนี้ได้ที่ไหน
Jim G.

3

การเรียนรู้ OOP นั้นไม่ได้มีประโยชน์เท่าการเรียนรู้การพัฒนาซอฟต์แวร์ ไปอ่านรหัสเสร็จสมบูรณ์ 2

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

นายหน้าที่แท้จริงจะบอกความแตกต่างระหว่างคุณที่รู้วิธีพัฒนาซอฟต์แวร์และจับคู่กล่องกาเครื่องหมาย "มี 3 ปีใน" OOP "


ใช่ในบริบทนี้ OOP ก็เหมือนกับ GUI เช่นเดียวกับใน "คุณต้องมีประสบการณ์ GUI 5 ปีสำหรับบทบาทนี้"
gbjbaanb

1

คำตอบคือใช่ดังที่คนอื่นหลายคนสังเกต

แต่ถ้าคุณต้องการทำงานกับสปาเก็ตตี้แบบไม่มีขั้นตอนของ OO คุณก็สามารถค้นหาได้เช่นกัน ฉันคิดว่าคุณจะชอบงาน OO มากกว่า

แก้ไข: ยกโทษให้กรณีของฉันของความเห็นถากถางดูถูกมือปืนและอารมณ์ขัน ดังที่ Raynos พูดเพียงเพราะมีบางสิ่งที่ OO ไม่ได้หมายความว่าดี การใช้งานที่เหมาะสมของ OO นั้นใช้งานและคิดอย่างแท้จริง เพียงแค่มีอินสแตนซ์ของมันไม่ได้หมายความว่าแอปนั้นถูกสร้างขึ้นมาอย่างดี และในทางกลับกันฉันแน่ใจว่ามีโค้ดโพรซีเดอร์ที่เขียนออกมาได้ดี ประสบการณ์ของฉันในร้านค้าไอทีขององค์กรในช่วงปี 90 และปี 2000 ได้มีการเขียนโค้ดที่ไม่ดีจำนวนมากและอาจยังคงมีอยู่ แต่ใกล้กับคำถามของ OP ฉันได้สังเกตเห็นว่านักพัฒนาที่ฉลาดกว่านั้นเมื่อได้รับโอกาสให้ย้ายไปยังระบบ OO มากขึ้น


3
-1 สำหรับรหัส non-OO ที่อ้างถึงคือสปาเก็ตตี้ และ OO นั้นก็ทำให้ "ไม่ปาเก็ตตี้" ดีด้วยมนต์ดำ
Raynos

@ Raynos นั่นคือจุดยุติธรรม และเพียงเพราะบางสิ่งไม่ได้ใช้ OO ไม่ได้หมายความว่าไม่ดี ฉันจะแก้ไข
Bernard Dy

มันยังไม่ได้เป็นเพียงขั้นตอนเทียบกับขั้นตอน / OOP แต่ยังมีกระบวนทัศน์การทำงาน
ทางเลือก

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

2
ใช่ใช่พันครั้งใช่! โปรดดูการแก้ไข ความคิดเห็นของฉันเป็นหนามมากกว่าในหลาย ๆ กรณีของรหัสมรดกที่ไม่ดีฉันมีความสุขที่ได้ทำงานมากกว่ามันเป็นเรื่องที่น่ารังเกียจอย่างหนึ่งของขั้นตอนหรือ OO แต่ถ้าฉันมีทางเลือกฉันก็ควรทำงานกับระบบ OO ที่ออกแบบมาอย่างดีกว่าระบบขั้นตอนที่ออกแบบมาอย่างดี และระบบที่ออกแบบมาอย่างดีเหนือระบบที่ออกแบบมาไม่ดีวันใดวันหนึ่ง
Bernard Dy

1

OO เป็นพื้นฐานที่ใช้สร้างเทคนิคอื่น จุดสำคัญคือการเข้าใจความแตกต่างระหว่างประเภท (คลาส) และอินสแตนซ์ของประเภทนั้นก่อน อย่าพยายามอ่านโดยไม่เข้าใจอย่างเต็มที่ (คิดว่ามันจะชัดเจนในภายหลัง) เพราะคุณจะต้องอ่านส่วนที่เหลือทั้งหมดอีกครั้งเมื่อคุณเห็นภาพ

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

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

งานต่อไปตรงกันข้ามทั้งหมด วัตถุอาศัยอยู่ในแอปพลิเคชันบนเดสก์ท็อป (ใช้ Excel) การเริ่มต้นมากที่สุดเท่าที่เป็นไปได้ควรอยู่ในตัวสร้าง (หรือหนึ่งในตัวสร้างมากเกินไป) ไม่อนุญาตให้สร้างสิ่งก่อสร้างที่ว่างเปล่าเนื่องจากวัตถุที่ว่างเปล่าไม่มีสิทธิ์ในการดำรงอยู่ (ซึ่งทำให้มีความท้าทายค่อนข้างมาก) นอกจากนี้ฉันต้องปรับให้เข้ากับ "มาตรฐานรูปแบบการเข้ารหัส" ของพวกเขา (ที่จะเปิดวงเล็บเพิ่มช่องว่างหลังความคิดเห็น ฯลฯ ... ) เพราะรหัสของฉันไม่สามารถตรวจสอบได้ถ้ามันไม่ได้ผ่านสไตล์ตำรวจ

ขณะนี้ฉันทำงานที่ บริษัท ที่ไม่มีนักพัฒนาคนใดเคยพยายามเข้าใจ OO เป็นการยากที่จะแสดงว่ามันน่าผิดหวังอย่างมาก ฉันต้องพัฒนาทักษะ Grep ของฉันอันที่จริงฉันมีมาโคร HotScripts ที่กำหนดให้กับคีย์ F12 ของฉันเพื่อทำ grep ในข้อความที่เลือก ฉันจะสำรองความผิดหวังอื่น ๆ ...

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

ขออภัยสำหรับคำตอบที่ยาว แต่ฉันพยายามครอบคลุมขอบเขตคำถามส่วนใหญ่ของคุณ :-)


ขอบคุณมากสำหรับเรื่องราวของคุณ .. ฉันสนุกที่ได้อ่านมัน! ขณะนี้ฉันกำลังทำงานในโครงการ C ++ และฉันใช้โอกาสนี้เพื่อคิดหาวิธีที่เป็นไปได้ที่ฉันสามารถใช้เทคนิค OO มันจะไปได้ดีในขณะนี้ :) +1 ให้คุณตอบ ขอขอบคุณ.
เบียร์

1

OOP นั้นไม่สำคัญเพราะตัวมันเอง แต่เนื่องมาจากสิ่งที่มันทำ สิ่งที่เกี่ยวข้องกับความสามารถในการแยกและนามธรรมสิ่งต่าง ๆ ในกลุ่มรวมกันจบลงด้วยการเปิดเผยเฉพาะส่วนที่ต้องมีการโต้ตอบด้วยกัน

นี่เป็นเทคนิคทางวิศวกรรมทั่วไปที่เรียกว่า "การทำให้เป็นโมดูล" ซึ่งอนุญาตให้สร้างระบบที่ซับซ้อนเป็นการรวมกลุ่มของสิ่งที่ง่ายกว่าโดยไม่ต้องใส่ใจในทุกรายละเอียดในระดับสูงและต้องการส่วนประกอบที่จะเปลี่ยนได้แม้ว่าจะไม่เป็น เหมือนกัน.

"แนวคิดทางวิศวกรรม" เหล่านั้นได้ถูกพยายามที่จะถูกเก็บไว้ในการพัฒนาซอฟต์แวร์จากเวลาที่ผลิตภัณฑ์ซอฟต์แวร์ตัวเองมีขนาดใหญ่กว่า "ความสามารถในการพัฒนาเดี่ยว" ดังนั้นจึงต้องมีวิธีที่จะทำให้นักพัฒนาทำงานบนชิ้นอิสระ โต้ตอบกัน

ที่กล่าวว่าหลักการเหล่านั้นไม่จำเป็นต้องพบใน OOP เท่านั้น (ทฤษฎีการคำนวณนั้นถูกต้องมีวิธีการที่เป็นไปได้ที่ไม่มีที่สิ้นสุดเพื่อให้ได้ผลลัพธ์เหล่านั้น)

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

นึกถึง OOP ก่อนไม่ใช่เป็น " คุณสมบัติภาษา " แต่เป็น " พจนานุกรมทั่วไป " ที่ทำให้วิศวกรซอฟต์แวร์เข้าใกล้การออกแบบซอฟต์แวร์

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

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

วิธีที่ OOP เหมาะสมกับภาษาขึ้นอยู่กับวิธีที่ผู้ออกแบบภาษาตีความหลักการ OOP ในโครงสร้างของตัวเอง

ดังนั้น "encapsulation" ใน C ++ จึงกลายเป็น "สมาชิกส่วนตัว" (และ "แคปซูล" กลายเป็นคลาส), "การแทนที่" กลายเป็นฟังก์ชั่นเสมือนการแทนที่หรือเทมเพลต parametrization / ความเชี่ยวชาญ ฯลฯ ในขณะที่ D แคปซูลคือ "โมดูล" (และการทดแทน ผ่านชั้นเรียนเป็นต้น) ทำให้กระบวนทัศน์หรือรูปแบบบางอย่างมีให้ใช้โดยตรงในภาษาที่กำหนดไม่ใช่ในรูปแบบอื่นเป็นต้น

นายหน้าคนใดที่ต้องการถามคำถาม OOP เพียงตรวจสอบความสามารถของคุณในการออกแบบซอฟต์แวร์ที่เป็นนามธรรมและเป็นรูปธรรมสำหรับโครงการขนาดใหญ่และการพัฒนาในอนาคต OOP สำหรับพวกเขาเป็นเพียง "พจนานุกรม" ที่พวกเขาควรจะรู้ทั้งตัวคุณและพวกเขาเพื่อให้คุณสามารถพูดคุยเกี่ยวกับสิ่งทั่วไปอื่น ๆ เพิ่มเติมหรือรวมเข้าด้วยกันในการดำเนินงานที่เฉพาะเจาะจง


0

ภาษาเชิงวัตถุช่วยให้คุณออกแบบเชิงวัตถุในรหัสของคุณได้ดี แต่มันก็เป็นความจริงที่การออกแบบดังกล่าวสามารถรับได้ด้วยภาษากระบวนทัศน์อื่น ๆ : เหตุผลของความนิยม (โดยเฉพาะอย่างยิ่งระหว่าง บริษัท ) ของ OO-languages ​​อาจจะประสบความสำเร็จในเชิงพาณิชย์ของ java และ c #

หากนายเกตส์เริ่มต้น บริษัท ของเขาอย่างถูกวิธีเราอาจจะศึกษา SCHEME ก่อนสมัครงาน


โครงการปรากฏขึ้นในปีเดียวกับที่ Microsoft ทำ (แม้ว่าจะมี LISPs อื่น ๆ มาก่อนหน้านั้น) นอกจากนี้ Java และ C # ยังประสบความสำเร็จอย่างมากกับ Alan Kay โดยเฉพาะ Smalltalk และ Simula ก่อนหน้านั้นรวมถึงความสำเร็จของ C ++
JasonTrue

0

คำตอบสั้น ๆ คือใช่

รุ่นที่ยาวขึ้นว่าทำไมคุณถึงรู้สึกหรือกระอักกระอ่วนว่าทำไมความสำคัญของรุ่นนี้ก็เนื่องมาจากความจริงที่ว่าคุณไม่ได้ทำงานในโครงการหรือการนำไปใช้งานใด ๆ มันสมบูรณ์แบบในห้องเรียนที่มีตัวอย่างเกี่ยวกับรถยนต์แล้วขยายไปถึงรถยนต์รถบรรทุก ... แต่เมื่อคุณกระโดดเข้าไปในการพัฒนาซอฟต์แวร์มันเป็นโซลูชันที่มีเป้าหมายเพื่อความสะดวกในงานบางอย่าง ตอนนี้ถ้าไม่ใช่เพราะOOเราจะให้ทุกคนเขียนรหัสที่คล้ายกันข้ามฐานรหัสหรือบูรณาการล้อทุกวัน ลองนึกภาพดูสิว่ามันจะเลอะเทอะขนาดไหน ตัวอย่างในชั้นเรียนมีไว้สำหรับคำจำกัดความที่คลุมเครือหรือการเป็นตัวแทนของวิธีการ / เหตุผลที่จะทำ การทดสอบจริงจะเกิดขึ้นเมื่อคุณเริ่มสร้างแอปพลิเคชันของคุณไม่ต้องสงสัยเลยว่ามันจะใช้งานได้อย่างน่ากลัว แต่อย่างใดมันมีน้ำหนักเบากว่าความมีสติเนื่องจากการใช้งานที่ชัดเจนและรัดกุม ดังนั้นการเริ่มต้นที่ดีกว่าในการทำงานในพื้นที่ที่อ่อนแอเหล่านี้อย่างน้อยที่สุดคุณก็ต้องกำจัดรหัสฝันร้าย


0

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

ขึ้นอยู่กับภาษาเฉพาะที่ บริษัท ใช้การสืบทอดและความหลากหลายมีความสำคัญอย่างยิ่งหรือเกี่ยวข้องกันพอสมควร คุณไม่สามารถทำอะไรใน Java ได้โดยไม่ทำให้รูปแบบการออกแบบ 10 GoF และกรอบการฉีดพึ่งพา Java เป็นหนึ่งในภาษาที่ใช้กันอย่างแพร่หลายดังนั้นหลักการ OO จึงมีความสำคัญต่อ บริษัท ต่างๆที่ใช้ Java

หาก บริษัท กำลังใช้ภาษา OO / ฟังก์ชันลูกผสมที่ทันสมัยซึ่งมีลูกแกะและพอยน์เตอร์ฟังก์ชั่นเช่น Scala หรือ C # ดังนั้นการถ่ายทอดทางพันธุกรรมก็มีความสำคัญน้อยกว่าเพราะคุณมีฟังก์ชั่นลำดับสูงกว่าในการจัดการกับสิ่งที่ง่าย ๆ พิธี. อย่างไรก็ตามคุณยังต้องสามารถทำงานกับเนื้อหา OO ได้เพราะห้องสมุดส่วนใหญ่ที่คุณใช้จะเขียนด้วยวิธี OO

หากการสืบทอดและความหลากหลายไม่สำคัญต่อ บริษัท คุณยังคงมีโอกาสได้รับคำถาม OO เนื่องจาก:

  • คุณถูกสัมภาษณ์โดยบุคคล HR ที่ไม่รู้อะไรเกี่ยวกับการเขียนโปรแกรมและกำลังถามคำถามจากรายการตรวจสอบ คุณมี X 3 ปีคุณทำงานหลายอย่างหรือไม่เป็นต้น
  • คุณถูกสัมภาษณ์โดยวิศวกรที่ต้องการให้แน่ใจว่าคุณไม่ได้อยู่ใต้ก้อนหิน OO เป็นภาษากลางดังนั้นคุณจะถูกถามคำถามคร่าวๆเกี่ยวกับมัน
  • คุณถูกสัมภาษณ์โดยวิศวกรที่ไม่ค่อยเชี่ยวชาญในการสัมภาษณ์ โดยทั่วไปแล้ววิศวกรชอบเรื่องไม่สำคัญและความซับซ้อนดังนั้นคุณจะได้รับคำถามมากมายเกี่ยวกับความหลากหลายรูปแบบการสืบทอดและรูปแบบการออกแบบของ GoF เท่านั้นเพราะสิ่งเหล่านี้น่าสนใจสำหรับผู้ที่สัมภาษณ์คุณ

ทำไม downvote
แดน

-1

ในคำว่า "ใช่"

คุณอาจคิดว่าคุณรู้ทฤษฎี แต่คุณต้องเขียนโค้ดและนำไปปฏิบัติ มีตัวอย่างและแบบฝึกหัดนับพันตัวอย่างที่ให้บริการออนไลน์

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