Khiếu nại của bạn rằng "C++ và Java API có nghĩa vụ phải làm điều tương tự" là vô căn cứ. Họ không có tài liệu để làm những điều tương tự. Mỗi ngôn ngữ đầu ra có thể tạo ra một cách giải thích khác nhau về cấu trúc được mô tả trong tệp .proto. Lợi thế của điều đó là những gì bạn nhận được trong mỗi ngôn ngữ là thành ngữ cho ngôn ngữ đó. Nó giảm thiểu cảm giác rằng bạn đang nói "viết Java bằng C++". Điều đó chắc chắn sẽ là cách Tôi muốn cảm thấy nếu có một lớp trình tạo riêng cho mỗi lớp thông báo.
Đối với trường số nguyên foo
, đầu ra C++ từ protoc sẽ bao gồm phương thức void set_foo(int32 value)
trong lớp cho thư đã cho.
Đầu ra Java thay vào đó sẽ tạo ra hai lớp. Một trực tiếp đại diện cho thông điệp, nhưng chỉ có getters cho lĩnh vực này. Lớp khác là lớp trình xây dựng và chỉ có các trình cài đặt cho trường.
Đầu ra Python vẫn khác. Lớp được tạo sẽ bao gồm một trường mà bạn có thể thao tác trực tiếp. Tôi hy vọng các plug-in cho C, Haskell và Ruby cũng khá khác nhau. Miễn là tất cả chúng có thể đại diện cho một cấu trúc có thể được dịch sang các bit tương đương trên dây, chúng đã hoàn thành công việc của chúng.Hãy nhớ rằng đây là "bộ đệm giao thức", không phải "bộ đệm API".
Nguồn cho trình cắm C++ được cung cấp với phân phối protoc. Nếu bạn muốn thay đổi kiểu trả về cho hàm set_foo
, bạn có thể làm như vậy. Tôi thường tránh các câu trả lời có giá trị, "Đó là nguồn mở, vì vậy bất kỳ ai cũng có thể sửa đổi nó" bởi vì nó thường không hữu ích khi đề nghị ai đó học một dự án hoàn toàn mới đủ để thực hiện những thay đổi lớn chỉ để giải quyết vấn đề. Tuy nhiên, tôi không mong đợi nó sẽ rất khó trong trường hợp này. Phần khó nhất là tìm phần mã tạo bộ giải mã cho các trường. Khi bạn thấy điều đó, việc thực hiện thay đổi bạn cần có thể sẽ đơn giản. Thay đổi kiểu trả về và thêm câu lệnh return *this
vào cuối mã được tạo. Sau đó, bạn có thể viết mã theo kiểu được đưa ra trong Hrnt's answer.
Nguồn
2010-02-26 16:17:58
Tôi nghĩ rằng đó có thể là sở thích cá nhân của trình cài đặt C++. Các nhà xây dựng không phải (ít nhất là trong kinh nghiệm của tôi), và trên thực tế, tôi sử dụng chúng trên khắp nơi mà một đối tượng có thể có một) nhiều tham số hoặc (nhiều khả năng) b) nhiều tham số tùy chọn. – moswald
một điều bạn không ghi chú trong câu hỏi của bạn là lớp Person là không thay đổi. –