โค้ดตัวอย่างเพื่ออธิบายปัญหา Banana Monkey Jungle โดย Joe Armstrong [ปิด]


14

ในหนังสือโคเดอร์ในที่ทำงาน Joe Armstrong ระบุว่า:

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

ฉันไม่ได้รับมันมากที่นี่ หากปัญหาคือการได้รับกล้วยเราสามารถสรุปเหตุผลทั้งหมดที่อยู่เบื้องหลังฟังก์ชั่น 'getBanana' ลิงและป่ามีส่วนเกี่ยวข้องอย่างไรในบริบทนี้ ใครบางคนสามารถเขียนโค้ดขนาดสั้นที่อธิบายถึงปัญหาในวิธีที่เข้าใจง่ายขึ้นพูดแสดงให้เห็นถึงความจริงที่ว่าBananaวัตถุนั้นต้องการMonkeyและJungleวัตถุที่จะเริ่มต้นได้โปรด



น่าเสียดายที่เรื่องนี้ถูกปิดลง ดูฟังก์ชั่นชั้นหนึ่งเป็นผู้เริ่มต้น
Robbie Dee

1
@Euphoric คำถามประเภทการสนทนาได้รับอนุญาตจริงแต่คำถามที่เป็นอัตนัยอาจ ... ส่วนตัว
Robbie Dee

2
ฉันเชื่อว่าการสัมภาษณ์นี้จัดขึ้นก่อน Joe Armstrong เขียนวิทยานิพนธ์ระดับปริญญาเอกของเขา ในขณะที่เขียนวิทยานิพนธ์ปริญญาเอกของเขาอาร์มสตรองได้เรียนรู้เกี่ยวกับคำจำกัดความที่แท้จริงของ OO และตระหนักว่า Erlang เป็นภาษาเชิงวัตถุอย่างแท้จริงในความเป็นจริงของภาษากระแสหลักทั้งหมด Erlang อาจเป็นภาษาเชิงวัตถุมากที่สุด ! เขาจะไม่ทำสิ่งนั้นด้วยวิธีนี้ถ้าเขารู้ว่า Erlang เป็นภาษา OO สิ่งที่เขากำลังพูดถึงคือผู้มีอำนาจโดยรอบซึ่งไม่มีส่วนเกี่ยวข้องใด ๆ กับ OO
Jörg W Mittag

1
สวัสดีคำถามของฉันเกี่ยวกับการให้โค้ดตัวอย่างที่ช่วยให้ฉัน (และอื่น ๆ ) เข้าใจปัญหาได้ดีขึ้น ข้อมูลโค้ดใด ๆ ที่แสดงถึงปัญหานั้นเป็นที่ยอมรับไม่ใช่แค่ความคิดเห็น
Kha Nguyễn

คำตอบ:


16

เขากำลังบอกความจริงว่าโปรแกรม OOP จริงส่วนใหญ่ไม่เคารพการแยกข้อกังวล ตัวอย่างเช่นคุณอาจมีคลาส:

public class Banana
{
    public Monkey Owner {get;}
}

public class Monkey
{
    public Jungle Habitat {get;}
}

public class Jungle
{
}

ถ้าคุณใช้Bananaมันเป็นสกรรมกริยาจำเป็นที่จะต้องขึ้นอยู่กับการและMonkeyJungle

แต่ฉันก็ไม่เห็นด้วยอย่างยิ่งว่านี่เป็นปัญหาของ OOP และสไตล์การใช้งานก็ไม่มีอยู่ สามารถแก้ไขได้อย่างง่ายดายใน OOP ด้วยการแนะนำสิ่งที่เป็นนามธรรมที่ถูกต้อง

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

สิ่งที่เป็นนามธรรมอาจเป็นไปได้:

public class Banana
{
    public IBananaOwner Owner {get;}
}

public interface IBananaOwner
{
}

public class Monkey : IBananaOwner
{
    public Jungle Habitat {get;}
}

public class Jungle
{
}

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


และในขณะที่ภาษาที่ใช้งานรองรับฟังก์ชั่นชั้นหนึ่งนอกกรอบ - นั่นไม่ได้หมายความว่าฟังก์ชั่น X สามารถใช้งานได้อย่างปลอดภัยโดยฟังก์ชั่น Y โดยไม่มีผลข้างเคียง
Robbie Dee

แม้ว่าคุณจะทำคะแนนได้ดี แต่ฉันคิดว่าคุณอาจจะหยุดเล่นสกีที่นี่เล็กน้อย อ้างถึงอย่างชัดเจนกล่าวถึงสภาพแวดล้อมที่ไม่ได้รับการออกแบบรหัส
Robbie Dee

@RobbieDee Monkeyและมีสภาพแวดล้อมสำหรับJungle Bananaโดยการนำเสนอสิ่งที่เป็นนามธรรมเช่นIBananaOwnerสภาพแวดล้อมจะกลายเป็นชัดเจน และสภาพแวดล้อมแบบนี้ได้รับการออกแบบมาอย่างไรเป็นปัญหาของเขา
ร่าเริง

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

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

13

กอริลล่าไม่ใช่ลิง!

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

มันเป็นตัวอย่างที่ยอดเยี่ยมและจะไม่แย่ขนาดนั้นเสมอไป แต่ไม่ใช่เรื่องแปลกที่จะจบด้วยระบบ OO เช่นนี้ ดังนั้นเพื่อทดสอบgetBananaวิธีนั้นฉันต้องยกตัวอย่างหรือเยาะเย้ยทั้งป่า


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