Biên tập:
Để tránh nhầm lẫn thêm: Tôi không nói về các dịch vụ web và như vậy. Tôi đang nói về cấu trúc các ứng dụng trong nội bộ, nó không phải là về cách máy tính giao tiếp. Đó là về ngôn ngữ lập trình, trình biên dịch và cách mô hình lập trình mệnh lệnh được mở rộng.
Nguyên:
Trong lĩnh vực lập trình bắt buộc, chúng ta đã thấy hai mô hình trong 20 năm qua (hoặc hơn): hướng đối tượng (OO) và hướng dịch vụ (SO) aka. dựa trên thành phần (CB).
Cả hai mô hình mở rộng mô hình lập trình mệnh lệnh bằng cách đưa ra khái niệm mô-đun của riêng họ. OO gọi chúng là các đối tượng (và các lớp) và cho phép chúng gói gọn cả dữ liệu (trường) và thủ tục (phương thức) với nhau. Ngược lại, SO tách dữ liệu (bản ghi, đậu, ...) khỏi mã (thành phần, dịch vụ).
Tuy nhiên, chỉ có OO có các ngôn ngữ lập trình hỗ trợ mô hình của nó: Smalltalk, C ++, Java và tất cả các tương thích JVM khác, C # và tất cả các tương thích .NET khác, Python, v.v.
SO không có ngôn ngữ bản địa như vậy. Nó chỉ tồn tại trên các ngôn ngữ thủ tục hoặc ngôn ngữ OO: COM / DCOM (nhị phân, C, C ++), CORBA, EJB, Spring, Guice (tất cả Java), ...
Các khung SO này rõ ràng phải chịu sự hỗ trợ ngôn ngữ bản địa bị thiếu trong các khái niệm của chúng.
- Họ bắt đầu sử dụng các lớp OO để đại diện cho các dịch vụ và hồ sơ. Điều này dẫn đến các thiết kế trong đó có sự phân biệt rõ ràng giữa các lớp chỉ có phương thức (dịch vụ) và các lớp chỉ có trường (bản ghi). Kế thừa giữa các dịch vụ hoặc bản ghi sau đó được mô phỏng bằng sự kế thừa của các lớp. Về mặt kỹ thuật, nó không được giữ nghiêm ngặt như vậy nhưng nói chung các lập trình viên được khuyến khích làm cho các lớp chỉ đóng một trong hai vai trò.
- Họ sử dụng các ngôn ngữ bên ngoài bổ sung để thể hiện các phần còn thiếu: IDL, cấu hình XML, Chú thích trong mã Java hoặc thậm chí DSL được nhúng như trong Guice. Điều này đặc biệt cần thiết, nhưng không giới hạn, vì thành phần của các dịch vụ không phải là một phần của mã dịch vụ. Trong OO, các đối tượng tạo các đối tượng khác để không cần các phương tiện như vậy nhưng đối với SO thì có vì các dịch vụ không khởi tạo hoặc định cấu hình các dịch vụ khác.
- Họ thiết lập một hiệu ứng nền tảng bên trong trên OO (EJB, CORBA đầu tiên) trong đó lập trình viên phải viết tất cả các mã cần thiết để "lái" SO. Các lớp chỉ đại diện cho một phần bản chất của dịch vụ và rất nhiều lớp phải được viết để tạo thành một dịch vụ cùng nhau. Tất cả các tấm nồi hơi là cần thiết bởi vì không có trình biên dịch SO sẽ làm điều đó cho lập trình viên. Điều này giống như một số người đã làm nó trong C cho OO khi không có C ++. Bạn chỉ cần truyền bản ghi chứa dữ liệu của đối tượng làm tham số đầu tiên cho thủ tục là phương thức. Trong ngôn ngữ OO, tham số này là ẩn và trình biên dịch tạo ra tất cả mã mà chúng ta cần cho các hàm ảo, v.v. Đối với SO, điều này rõ ràng là thiếu.
- Đặc biệt là các khung mới hơn sử dụng rộng rãi AOP hoặc hướng nội để thêm các phần còn thiếu vào ngôn ngữ OO. Điều này không mang lại tính biểu cảm ngôn ngữ cần thiết nhưng tránh được mã nền tảng nồi hơi được mô tả ở điểm trước.
- Một số khung sử dụng tạo mã để sản xuất mã tấm nồi hơi. Các tệp cấu hình trong XML hoặc các chú thích trong mã OO là nguồn thông tin cho việc này.
Không phải tất cả các hiện tượng mà tôi đã đề cập ở trên có thể được quy cho SO nhưng tôi hy vọng nó cho thấy rõ ràng rằng cần có một ngôn ngữ SO. Vì mô hình này rất phổ biến: tại sao không có? Hoặc có thể có một số học thuật nhưng ít nhất ngành công nghiệp không sử dụng một.