Chúng ta có thể làm cho việc thêm luồng dữ liệu giữa các phần xa của một cơ sở mã lớn dễ dàng hơn không?


10

Khi thực hiện thay đổi cho các hệ thống lớn, tôi thường gặp phải vấn đề là một số chức năng cần lấy một số dữ liệu từ một phần khác, nhưng chúng ở các phần khác nhau của cây gọi sâu và phân nhánh, có thể chảy qua các trình nghe sự kiện, các cuộc gọi bị hoãn, vv Bằng cách này, một sự thay đổi đơn giản có thể bóng bay nhanh chóng.

Một trích dẫn có liên quan từ bài đăng trên blog của Yossi Kreinin tại http://www.yosefk.com/blog/i-want-a-struct-linker.html :

Bạn có một số loại cấu trúc dữ liệu mà bạn vượt qua rất nhiều. Chẳng mấy chốc, thứ có giá trị nhất về cấu trúc không phải là dữ liệu mà nó lưu giữ, mà thực tế là nó có sẵn trong suốt quá trình kiểm soát một số sợi lông.

Biến toàn cục là một cách cổ điển để cho phép mã "hét lên" thành mã xa, nhưng chúng được biết là có vấn đề. Các biến có phạm vi động là một cách hạn chế hơn, nhưng chúng cũng có vấn đề.

Có nghiên cứu ngôn ngữ lập trình nào nhằm giải quyết vấn đề này không? Chúng ta có thể làm cho việc thêm các luồng dữ liệu không dự đoán vào một cơ sở mã lớn dễ dàng hơn trong khi vẫn kiểm tra tĩnh, kiểm tra đơn vị dễ dàng và các tính năng khác không?


Cách bạn diễn đạt câu hỏi của bạn Tôi đoán bạn có luồng dữ liệu trong một quy trình duy nhất, không có giao tiếp liên tiến trình. Vì vậy, loại vấn đề nào bạn thấy không thể giải quyết được bằng các cơ chế người gửi / người nghe sự kiện tiêu chuẩn?
Doc Brown

Một ví dụ giả định: hãy tưởng tượng rằng sâu bên trong hệ thống của bạn có một số mã gửi cho người dùng một tin nhắn văn bản. Và bạn nhận được một yêu cầu mới rằng văn bản của tin nhắn phải phụ thuộc vào thời gian hiện tại trong múi giờ của người dùng. Callstack trông như thế này: một số mã biết múi giờ của người dùng, gọi một phương thức gọi một phương thức (... lặp lại 15 lần) gọi một phương thức tạo ra văn bản thông báo. Đây là một ví dụ đơn giản theo tiêu chuẩn của tôi, bởi vì nó chỉ liên quan đến giao tiếp đi xuống, nhưng bạn vẫn phải thay đổi chữ ký của 15 phương pháp để thay đổi tầm thường của mình.
Vladimir Slepnev

Chà, tôi đoán điều có thể giúp là mô hình hóa luồng dữ liệu một cách rõ ràng và tách các thành phần khỏi luồng dữ liệu. Kỹ sư phần mềm người Đức đang viết rất nhiều về chủ đề này, hầu hết các bài viết bằng tiếng Đức. Đây là một bài viết bằng tiếng Anh của anh ấy: geekswithbloss.net/theArchitectsNapkin/archive/2011/03/19/19
Doc Brown

Tôi nghĩ rằng một API nội bộ đơn lẻ có thể giúp đỡ. Nó có thể truy cập được trên tất cả các ứng dụng và sẽ gói gọn tất cả logic truy xuất dữ liệu.
superM

Câu trả lời:


1

Bạn đang đề cập đến CDI (Tiêm phụ thuộc bối cảnh) AKA IoC (Đảo ngược điều khiển). Java JSF và Spring Framework là một số ví dụ. ASP.NET MVC có các plugin như Unity. Javascript đang bắt đầu có các cấu trúc được tổ chức bằng các thư viện như RequireJS, có hành vi tiêm chích được thấy trong nhiều khung công tác JS hiện đại. Đó là để kết nối các ứng dụng địa phương và từ xa.

Để ghép nối lỏng lẻo giữa các mạng, các công ty muốn sử dụng Dịch vụ web với SOAP, REST, AJAX hoặc gọi phương thức từ xa thông thường với RPC. Trong Java, bạn có thể sử dụng JAX-WS hoặc .NET WCF để xây dựng các dịch vụ phân tán. Sau đó, bạn xếp chúng trong một bus dịch vụ hoặc "luồng dữ liệu" từ bất kỳ ngôn ngữ hoặc nền tảng nào với tư cách là khách hàng. Ruby, Python, Scala, Java, C #, ... bất cứ thứ gì.

Khớp nối lỏng lẻo cho phép bạn phân chia và chinh phục các vấn đề và các dịch vụ thường là điểm vào cơ sở dữ liệu để lấy dữ liệu. Bước lên thang chúng ta có con thú tên là Message Queue. Con đường đó dẫn đến khuôn khổ loại doanh nghiệp và cơ sở hạ tầng.

Tuy nhiên, nếu dự án của bạn khăng khăng không có mạng, có những ngôn ngữ như Scala, Akka, NodeJS, v.v. được thiết kế cho một luồng dữ liệu cao trong một ứng dụng. Họ cũng làm việc với một số hoặc tất cả các công nghệ được đề cập trước đây cho các dự án phức tạp. Ví dụ, Scala có thể được sử dụng với các dịch vụ JAX-RS REST để lấy loại "dữ liệu toàn cầu" từ nguồn dữ liệu và có Spring cho hệ thống dây điện bên trong IoC. Ngoài ra còn có nhiều khung thực hiện công việc hoặc quy trình công việc trong các công cụ JBoss, .NET và GUI như MuleESB. Trong quá trình phát triển, Eclipse và Netbeans cho phép bạn kéo và thả các dịch vụ trong màn hình biểu đồ luồng trực quan.

Cuối cùng, Java vẫn có đậu Singleton. Để điều chỉnh các phương thức của bạn trong thời gian chạy, hãy sử dụng proxy hoặc khung phản chiếu. Nhưng thành thật mà nói, đó là năm 1999.

Nếu bạn đang thực hiện nhiều cuộc gọi để gửi tin nhắn cho người dùng dựa trên múi giờ của họ, thì theo tôi, có lẽ có một cách 2 bước để đạt được hiệu quả tương tự mà người dùng nhìn thấy. Nhưng vâng, các khung CDI được mặc bởi các ngôn ngữ hiện có như một chiếc áo khoác mang lại cho chúng tất cả các sức mạnh linh hoạt mà bạn đã đề cập. Tôi thích gọi nó là tiềm thức của chương trình của tôi, chăm sóc công việc bẩn một cách liền mạch.


Hàng đợi tin nhắn có thể là quá mức cần thiết nhưng nhắn tin là cách hoàn hảo để có được các sự kiện được tổ chức trên bảng. Java sử dụng Đậu điều khiển thông báo (MDB) và điều đó sẽ cho phép chương trình của bạn gửi hoặc nhận 'cuộc hội thoại' với nhau. Bạn có thể làm theo cách này để nhận phần thưởng không đồng bộ.
Nhà phát triển Senor

Cảm ơn các con trỏ! Nó chắc chắn làm cho tôi tự hỏi làm thế nào một ngôn ngữ có thể trông như thế nào nếu nó được thiết kế từ đầu để hỗ trợ tiêm phụ thuộc và các mẫu tương tự.
Vladimir Slepnev

0

Cách đơn giản nhất để thực hiện việc này trên quy mô lớn trên thực tế là sử dụng một số loại API đóng gói dữ liệu. Đây có thể là một cửa hàng NoQuery hoặc nó có thể là một RDBMS được đóng gói (hoặc thực tế nó có thể ở cả hai thời điểm và địa điểm khác nhau trong cùng một ứng dụng-- không có lý do nào khiến bạn không thể xử lý RDBMS lâu dài lưu trữ và xử lý db NoQuery điều khiển trạng thái ngắn hạn). Nó thậm chí có thể là một loạt các đối tượng đơn lẻ.

Cấu trúc dữ liệu của bạn sau đó có thể được cung cấp trong một số không gian trung tính, theo cách được quản lý. Đây là cách tiếp cận mà chúng tôi thực hiện với LedgerSMB (nhưng với một vài biến bán toàn cầu cho những gì đơn lẻ được lưu trữ, nhưng một lần nữa chúng được quản lý, chúng tôi đã chọn trực tiếp đối tượng vì nó giúp quản lý các biến dễ dàng hơn một chút nhưng sau đó có tất cả 4 người trong số họ).

Tất nhiên mọi cách tiếp cận đều có sự đánh đổi và bạn không thể vượt qua những sự đánh đổi đó. Điều quan trọng là xem xét sự đánh đổi là gì (quản lý so với hiệu suất so với độ sạch của mã so với các cạm bẫy mã hóa tiềm năng) và đưa ra quyết định dựa trên những gì tốt nhất cho ứng dụng của bạn.


Cảm ơn câu trả lời! Dường như với tôi rằng nghiên cứu ngôn ngữ lập trình có thể giúp đỡ với vấn đề này. Ví dụ: nếu mã đọc một số dữ liệu từ cơ sở dữ liệu toàn cầu hoặc từ các singletons được lưu trữ, có thể có một đảm bảo tĩnh / khai báo về dữ liệu nào nó yêu cầu.
Vladimir Slepnev

-1

Nếu bạn sử dụng (hoặc trích dẫn) các từ

hairy flow of control

sau đó tôi cho rằng mã của bạn thực sự là một mớ hỗn độn. Bạn nên bỏ nó ngay lập tức. Nếu bạn sử dụng mô đun hóa / phân tách các mối quan tâm, không có thứ gọi là "dòng chảy kiểm soát lông". Mã của bạn chỉ đơn giản là thiếu tính đơn giản và cũng không thể hiểu được bởi thực tế là bạn đã đề cập đến các biến toàn cục :-).


Tại sao các downvote? Đoạn trích bị thiếu phần giới thiệu hỗ trợ chính xác cho quan điểm của tôi: "(có lẽ nó được phân loại là" Antipotype "hoặc" Code Smell "và như vậy có một tên trong các vòng tròn thích hợp, nhưng tôi sẽ không biết, vì vậy tôi sẽ không biết để nó không tên) "
user127749

2
Đây thực sự không phải là một câu trả lời cho câu hỏi, đó có lẽ là lý do cho downvote
Daniel Gratzer

Sau đó, hãy để tôi đặt lại câu hỏi: có bất kỳ trò ảo thuật nào để hoàn tác mớ hỗn độn mã vi phạm một trong những nguyên tắc cơ bản nhất của thiết kế phần mềm: KISS (giữ cho nó đơn giản, ngu ngốc)? Bí quyết không phải là phép thuật, đó là một lập trình viên không thể thay thế bởi vì anh ta biết tất cả các chi tiết không rõ ràng (sẽ giết chết công ty trong dài hạn) hoặc để cơ cấu lại mã cơ sở. Thật không may, ban đầu, nhiều công ty không quan tâm đến việc thiết kế mã phù hợp hoặc thậm chí không hiểu hậu quả, sau đó phải viết lại mã của họ ít nhất một lần, nhiều người thậm chí đã viết lại nhiều lần trong ...
user127749
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.