Mã mẫu để giải thích vấn đề Banana Monkey Jungle của Joe Armstrong [đã đóng]


14

Trong cuốn sách Coders tại nơi làm việc, Joe Armstrong đã tuyên bố rằng:

Tôi nghĩ rằng việc thiếu khả năng sử dụng lại trong các ngôn ngữ hướng đối tượng, không phải trong các ngôn ngữ chức năng. Bởi vì vấn đề với các ngôn ngữ hướng đối tượng là chúng có tất cả môi trường ngầm mà chúng mang theo bên mình. Bạn muốn có một quả chuối nhưng những gì bạn nhận được là một con khỉ đột đang giữ quả chuối và toàn bộ khu rừng

Tôi không hoàn toàn hiểu nó ở đây. Nếu vấn đề là để có được một quả chuối, chúng ta có thể gói gọn tất cả logic đằng sau hàm 'getBanana'. Làm thế nào là khỉ và rừng tham gia vào bối cảnh này. Ai đó có thể viết một đoạn mã giải thích vấn đề theo cách dễ hiểu hơn, giả sử, chứng minh thực tế rằng Bananađối tượng yêu cầu MonkeyJunglecác đối tượng được bắt đầu, xin vui lòng?



Đáng tiếc điều này đã bị đóng cửa - nó đã mang lại một số cuộc thảo luận tốt. Nhìn vào các chức năng hạng nhất như là một khởi đầu.
Robbie Dee

1
@Euphoric Câu hỏi loại thảo luận thực sự được cho phép nhưng câu hỏi nào mang tính chủ quan có thể ... chủ quan.
Robbie Dee

2
Tôi tin rằng cuộc phỏng vấn này đã được tổ chức trước khi Joe Armstrong viết luận án tiến sĩ. Trong khi viết luận án tiến sĩ, Armstrong đã tìm hiểu về định nghĩa thực sự của OO và nhận ra rằng Erlang thực sự hoàn toàn hướng đối tượng, trên thực tế, trong tất cả các ngôn ngữ chính hiện tại, Erlang có lẽ là ngôn ngữ hướng đối tượng nhất ! Anh ta sẽ không đưa ra tuyên bố đó theo cách đó nếu anh ta biết rằng Erlang thực sự là một ngôn ngữ OO. Những gì anh ta đang nói là thẩm quyền xung quanh , trong đó hoàn toàn lưu ý bất cứ điều gì để làm với OO.
Jörg W Mittag

1
Xin chào, câu hỏi của tôi là về việc cung cấp một số mã mẫu giúp tôi (và những người khác) hiểu vấn đề tốt hơn. Bất kỳ đoạn mã nào chứng minh vấn đề đều được chấp nhận, không chỉ là ý kiến.
Kha Nguyễn

Câu trả lời:


16

Ông nói bóng gió về một thực tế, rằng phần lớn các chương trình OOP thực sự không tôn trọng sự tách biệt các mối quan tâm. Ví dụ: bạn có thể có các lớp:

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

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

public class Jungle
{
}

Nếu bạn sử dụng Banana, nó cũng cần thiết phụ thuộc vào MonkeyJungle.

Nhưng tôi hoàn toàn không đồng ý rằng đây là vấn đề với OOP và phong cách chức năng bằng cách nào đó không có nó. Điều này có thể dễ dàng được sửa trong OOP với việc giới thiệu trừu tượng đúng.

Vấn đề là nhiều hơn về các nhà phát triển không quan tâm đến việc tách các mối quan tâm. Và tôi sẽ không ngại khẳng định rằng phần lớn các lập trình viên OOP là người mới, trong khi các lập trình viên chức năng có một số kinh nghiệm, điều đó thúc đẩy họ tách mã của họ một cách hợp lý.

Sự trừu tượng có thể có thể là:

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

public interface IBananaOwner
{
}

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

public class Jungle
{
}

Bằng cách này, bạn biết rằng Bananacó chủ sở hữu, nhưng nó không phải là Monkey. Nó có thể là bất cứ thứ gì. Và nó giới hạn những gì có thể Bananalàm với chủ sở hữu chỉ các hoạt động được xác định bởi IBananaOwner, điều này giúp đơn giản hóa lý luận.


Và ngược lại, trong khi các ngôn ngữ chức năng hỗ trợ các chức năng hạng nhất ra khỏi hộp - điều đó không có nghĩa là chức năng X có thể được sử dụng một cách an toàn bởi chức năng Y mà không có tác dụng phụ.
Robbie Dee

Mặc dù bạn thực hiện một quan điểm tuyệt vời, tôi nghĩ rằng bạn có thể sẽ hơi lạc hậu ở đây. Các trích dẫn đề cập rõ ràng môi trường không phải là cách mã được thiết kế.
Robbie Dee

@RobbieDee Các MonkeyJunglelà một môi trường cho Banana. Bằng cách giới thiệu trừu tượng như thế IBananaOwner, môi trường trở nên rõ ràng. Và môi trường này được thiết kế như thế nào là vấn đề của anh ấy.
Euphoric

Bạn có thể rất đúng nhưng tôi không thể không nghĩ rằng đã đọc điều này trong số những điều khác mà con voi trong phòng (để thêm một con vật khác) là vấn đề nằm ở thành phần chính xác của các chức năng mà lập trình chức năng, trong lịch sử, có cho vay nhiều hơn
Robbie Dee

@RobbieDee Bạn không thể thay thế những gì tôi đã viết bằng thành phần chức năng đơn giản. Ít nhất không phải là vấn đề bên ngoài đồ chơi. Trong thực tế, để thay thế hoàn toàn thiết kế OOP, những thứ như khái quát phức tạp, lớp loại, đơn nguyên và các thứ khác là cần thiết. Và đó chỉ là thay đổi một loại phức tạp cho một loại khác.
Euphoric

13

Khỉ đột không phải là khỉ!

Bỏ qua chuyện đó, bạn trả lời câu hỏi của chính mình bằng " chúng ta có thể gói gọn tất cả logic đằng sau hàm 'getBanana' ". Tất cả những gì tôi muốn là một quả chuối, nhưng để có được nó, tôi cần phải gọi getBananamột số đối tượng, ví dụ như một thể hiện của Gorillalớp. Đối tượng chuối đó sau đó có khả năng chứa một tham chiếu đến khỉ đột mà nó thuộc về và đối tượng khỉ đột đó sẽ lần lượt có một tham chiếu đến khu rừng mà nó thuộc về. Vì vậy, tôi yêu cầu một quả chuối, nhưng gói gọn đằng sau đó là toàn bộ khu rừng.

Đó là một ví dụ cực đoan và sẽ không luôn tệ đến thế. Nhưng không có gì lạ khi kết thúc với một hệ thống OO như thế này. Và vì vậy, để kiểm tra getBananaphương pháp đó , tôi cần khởi tạo, hoặc giả, toàn bộ một khu rừng.


1
Điều này không trả lời câu hỏi vì nó không có mã mẫu ...
Robbie Dee
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.