2010-02-12 22 views
7

Tôi nhận thấy trong Ruby, API của nhà cung cấp thường trả về kết quả là mảng? Các đối tượng cũ không đồng bằng (như POJO trong Java) có tiêu chuẩn cao hơn không? Nếu tôi viết thư viện của riêng mình, tôi có nên sử dụng POJOs PORO không?Đối tượng cũ đồng bằng trong Ruby?

Trả lời

3

Đó là tất cả các đối tượng, mọi lúc. Điều quan trọng là liệu các đối tượng được trả lại có hành vi liên kết với chúng hay không. Đó là tốt để làm điều này:

def read_first_and_last_name(data_source) 
    [data_source.read_string, data_source.read_string] 
    end 

Nhưng ngay khi bạn tìm thấy ở đó là hành vi liên quan đến các mục dữ liệu ...

def print_name(first_name, last_name) 
    puts "#{first_name} #{last_name}" 
    end 

    def read_and_print_name 
    first_name, last_name = read_first_and_last_name(data_source) 
    print_name(first_name, last_name) 
    end 

...sau đó họ phải là một lớp:

class FullName 

    def FullName.read(data_source) 
     FullName.new(data_source.read_string, data_source.read_strng) 
    end 

    def initialize(first_name, last_name) 
     @first_name = first_name 
     @last_name = last_name 
    end 

    def print 
     puts "#{@first_name} #{@last_name}" 
    end 

    end 

Với hành vi của một tên độc đáo đóng gói, sử dụng trở nên đơn giản như:

def read_and_print_name 
    FullName.read(data_source).print 
    end 
4

Tôi nghĩ mảng so với đối tượng là sự phân đôi sai. Nó là hoàn toàn hợp lý, nơi một cuộc gọi API trở lại nhiều hơn một điều, rằng nó ở dạng một mảng (và một mảng là một đối tượng khá đơn giản, và do đó được cho là một 'PORO', trong ruby anyway)

Edit: để đáp lại ý kiến ​​của bạn:

Ví dụ bạn trích dẫn (http://github.com/cjheath/geoip) trả về một mảng các hạng mục khác nhau. Tôi đồng ý điều này không nhất thiết phải là định dạng tốt nhất để trả lại dữ liệu. Trong trường hợp đó tôi đã nghĩ rằng một băm với các khóa có tên hợp lý sẽ là một cấu trúc tốt hơn.

Như John Topley nói, bản chất OO của Ruby có nghĩa là mọi người không phải phát minh ra thuật ngữ như 'PORO', vì hàm băm đơn giản như bạn có thể nhận được.

+1

Không, bởi vì bạn cần phải tham khảo tài liệu API để xác định giá trị đang được đã quay lại vị trí nào. Nếu nó nằm trong một đối tượng tùy chỉnh, bạn sẽ không phải tham chiếu đến rdoc. – Zombies

+0

Bạn đang thực sự đề cập đến một mảng nơi bạn có các cá thể lớp khác nhau tại các điểm được xác định trước của mảng không? Bạn có thể liên kết với một ví dụ về loại điều bạn đang đề cập đến không? – DanSingerman

+0

http://github.com/cjheath/geoip .... Dường như các chức năng đó sẽ được hưởng lợi từ việc trả về các đối tượng tùy chỉnh thay vì một số ** chuỗi thay đổi ** trong một mảng – Zombies

2

Các mảng kết quả này chứa những gì? Câu trả lời là trong Ruby chúng chứa các đối tượng, bởi vì mọi thứ trong Ruby là một đối tượng.

POJO trong thế giới Java là phản ứng đối với một số phức tạp gây ra trên thế giới bởi doanh nghiệp Java, v.d. EJB. Để báo Martin Fowler người đặt ra thuật ngữ:.

"Chúng tôi tự hỏi tại sao mọi người đã rất chống sử dụng đối tượng thường xuyên trong hệ thống của họ và kết luận rằng đó là vì đối tượng đơn giản thiếu một tên ưa thích Vì vậy, chúng tôi cho họ một, và nó là bị bắt rất độc đáo. "

May mắn thay, Ruby luôn là điều tự nhiên để mọi người chỉ thực hành lập trình hướng đối tượng mà không cần phải tạo ra các thuật ngữ xung quanh nó.

+1

Tôi cho rằng những gì tôi thực sự hỏi là nếu có cách nào tốt hơn để lấy các thuộc tính có tên được trả về và tại sao nó không được sử dụng nhiều hơn, nên có lẽ tôi nên hỏi lại câu hỏi này! – Zombies

+1

Một lý do có thể là Gems như HTTParty làm cho nó rất dễ dàng để bọc các dịch vụ Web trong Ruby và nhận được một wrapper đối tượng nhẹ xung quanh JSON hoặc XML trả về miễn phí. –

2

Cá nhân tôi sử dụng PORO trong hầu hết mọi thứ tôi viết không phải là tập lệnh hoàn chỉnh.

Tôi thấy mình thường tạo kiểu chủ chứa dữ liệu của lớp sẽ quản lý và giữ nhiều đối tượng thuộc loại cụ thể của tôi và bao gồm một số phương thức trợ giúp. Tôi thấy điều này thuận tiện khi ai đó cũng phải làm việc với mã của tôi.

Tôi nghĩ câu hỏi này rất chủ quan theo nghĩa là không có câu trả lời luôn đúng. Đôi khi chỉ cần quay trở lại một mảng là tốt và không cần phải tạo thêm một lớp. Đôi khi mức độ trừu tượng thêm làm cho điều gì đó rõ ràng hơn cho người dùng.

+0

Đây chính là điều tôi đang thắc mắc. Cảm ơn bạn đã thêm đầu vào của mình. Tôi không nghĩ rằng đó là chủ quan vì tôi đang cố gắng để xem những gì người khác làm và đưa tất cả những điều này vào xem xét cho sự cải tiến của riêng tôi ... – Zombies

Các vấn đề liên quan