Ví dụ liên quan đến cắt chéo


120

Một ví dụ tốt của một là cross-cutting concerngì? Ví dụ hồ sơ bệnh án trên trang wikipedia dường như không đầy đủ với tôi.

Cụ thể từ ví dụ này, tại sao việc ghi nhật ký sẽ dẫn đến sao chép mã ( tán xạ )? (Bên cạnh những cuộc gọi đơn giản như log("....")ở mọi nơi, dường như không phải là vấn đề lớn).

Sự khác biệt giữa a core concernvà a là cross-cutting concerngì?

Mục tiêu cuối cùng của tôi là hiểu rõ hơn về AOP.

Câu trả lời:


234

Trước khi hiểu Mối quan tâm xuyên suốt , chúng ta phải hiểu Mối quan tâm .

Một lo ngại là một thuật ngữ dùng để chỉ một phần của hệ thống chia trên cơ sở các chức năng.

Mối quan tâm có hai loại:

  1. Các mối quan tâm đại diện cho chức năng duy nhất và cụ thể cho các yêu cầu chính được gọi là mối quan tâm cốt lõi .
    HOẶC
    Chức năng chính của hệ thống được gọi là mối quan tâm cốt lõi.
    Ví dụ : Logic kinh doanh
  2. Các mối quan tâm đại diện cho các chức năng cho các yêu cầu thứ cấp được gọi là mối quan tâm xuyên suốt hoặc mối quan tâm trên toàn hệ thống .
    HOẶC
    Các mối quan tâm xuyên suốt là một mối quan tâm đó là áp dụng trong suốt ứng dụng và nó ảnh hưởng đến toàn bộ ứng dụng.
    Ví dụ: ghi nhật ký, bảo mật và truyền dữ liệu là những mối quan tâm cần thiết trong hầu hết mọi mô-đun của ứng dụng, do đó chúng là mối quan tâm xuyên suốt.

Phép lịch sự

nhập mô tả hình ảnh ở đây

Hình này biểu thị một ứng dụng điển hình được chia thành các mô-đun. Mối quan tâm chính của mỗi mô-đun là cung cấp dịch vụ cho tên miền cụ thể của nó. Tuy nhiên, mỗi mô-đun này cũng yêu cầu các chức năng phụ trợ tương tự, chẳng hạn như ghi nhật ký bảo mật và quản lý giao dịch. Một ví dụ về mối quan tâm xuyên suốt là "ghi nhật ký", thường được sử dụng trong các ứng dụng phân tán để hỗ trợ gỡ lỗi bằng cách theo dõi các cuộc gọi phương thức. Giả sử chúng ta đăng nhập ở cả đầu và cuối của mỗi thân hàm. Điều này sẽ dẫn đến việc xen kẽ tất cả các lớp có ít nhất một hàm.

(Lịch sự)


1
"Mối quan tâm xuyên suốt là mối quan tâm có thể áp dụng trong toàn bộ ứng dụng" Không chắc chắn về điều này vì quản lý giao dịch không được áp dụng 'trong suốt' ứng dụng nhưng vẫn là mối quan tâm xuyên suốt. Và bức ảnh cho tôi không có gì phải trung thực, nó chỉ khó hiểu ..
Koray Tugay

Giải thích tốt, nhưng tôi có một vấn đề nhỏ với bức tranh mà chúng ta gọi là những mối quan tâm này, cắt ngang không phải là mối quan tâm xuyên suốt và tốt hơn là tôi nghĩ nên cắt giảm những mối quan tâm khác bằng những mối quan tâm xuyên suốt, không phải là cách khác. Giống như sự phát triển theo định hướng Aspect
hyeganeh

câu trả lời vẫn không giải thích được vấn đề chỉ bằng cách sử dụng một cái gì đó như Log4j và ghi nhật ký như LogManager.getLogger (). thông tin (ModuleName, tin nhắn)
Vicky Singh

49

Tôi nghĩ rằng ví dụ tốt nhất về mối quan tâm xuyên suốt là hành vi giao dịch. Chẳng hạn, phải đặt các khối thử bắt với các lệnh gọi cam kết và khôi phục trong tất cả các phương thức dịch vụ của bạn sẽ bị từ chối. Việc chú thích các phương thức với một điểm đánh dấu mà AOP có thể sử dụng để đóng gói chúng với hành vi giao dịch mong muốn là một chiến thắng lớn.

Một ứng cử viên tốt khác như một ví dụ về mối quan tâm xuyên suốt là ủy quyền. Chú thích một phương thức dịch vụ với một điểm đánh dấu cho biết ai có thể gọi nó và để một số lời khuyên AOP quyết định có cho phép gọi phương thức đó hay không, có thể thích hợp hơn để xử lý điều đó trong mã phương thức dịch vụ.

Việc thực hiện ghi nhật ký với lời khuyên AOP có thể là một cách để linh hoạt hơn, để bạn có thể thay đổi những gì được ghi bằng cách thay đổi điểm tham gia. Trong thực tế tôi không thấy các dự án làm điều đó rất thường xuyên. Thông thường sử dụng một thư viện như log4j cho phép bạn lọc theo cấp ghi nhật ký và danh mục, trong thời gian chạy nếu bạn cần, hoạt động đủ tốt.

Một mối quan tâm cốt lõi là một lý do mà ứng dụng tồn tại, logic kinh doanh mà ứng dụng tự động hóa. Nếu bạn có một ứng dụng hậu cần xử lý vận chuyển hàng hóa, việc tìm ra số lượng hàng hóa bạn có thể đóng gói trên một chiếc xe tải hoặc tuyến đường tốt nhất để xe tải đi để giao hàng có thể là mối quan tâm cốt lõi. Mối quan tâm xuyên suốt thường là các chi tiết triển khai cần được tách biệt khỏi logic kinh doanh.


2
Vì vậy, mặc dù hành vi giao dịch thực sự chỉ tồn tại trong lớp truy cập dữ liệu, bởi vì các khối thử bắt được sao chép qua rất nhiều phương thức, nó được coi là xuyên suốt. Nhận thức ban đầu của tôi là việc cắt chéo có nghĩa là mã kéo dài nhiều lớp của ứng dụng.
jlars62

4
@ jlars62: cắt chéo có nghĩa là nó đi đúng góc với các tính năng.
Nathan Hughes

7
@ jlars62: bởi ở góc bên phải, ý tôi là: nghĩ về một tính năng như một chồng các lớp. mối quan tâm xuyên suốt có thể chỉ áp dụng cho một lớp, nhưng nó phổ biến cho tất cả các tính năng.
Nathan Hughes

@NathanHughes Ủy quyền là một ví dụ tốt. Tôi chỉ tái cấu trúc ứng dụng của mình để đặt tất cả mã ủy quyền trong một kiến ​​trúc xuyên suốt và nó hoạt động kỳ diệu để dọn sạch rất nhiều mã. Tôi coi miền như một ngôi nhà. Nếu bạn có chìa khóa để vào, bạn có thể làm bất cứ điều gì bạn muốn trong đó (bạn được coi là chủ sở hữu). Nhưng bạn sẽ không khóa mọi cánh cửa trong nhà và yêu cầu một mục chính. Bạn hoặc là trong hoặc bạn không.
giàu

"Hành vi giao dịch" có thể phổ biến đối với nhiều tính năng nhưng điều này sẽ không "cắt chéo" vì nó không "vượt qua" các lớp. Lý do, ví dụ, ghi nhật ký là mối quan tâm xuyên suốt là vì tôi có thể muốn đăng nhập vào lớp trình bày, lớp nghiệp vụ, lớp dữ liệu, v.v.
CodingYoshi

14

Ngoài câu trả lời được chấp nhận, tôi muốn đề cập đến một ví dụ khác cho mối quan tâm xuyên suốt: từ xa. Nói rằng tôi chỉ muốn gọi các thành phần khác trong hệ sinh thái của mình như thể chúng đang chạy trong quá trình. Có thể trong một số trường hợp họ thậm chí làm. Nhưng bây giờ tôi muốn chạy các dịch vụ của mình được phân phối trong một đám mây hoặc cụm. Tại sao tôi nên quan tâm đến khía cạnh này như một nhà phát triển ứng dụng? Một khía cạnh có thể quan tâm đến việc tìm ra ai sẽ gọi và làm thế nào, tuần tự hóa dữ liệu được truyền nếu cần thiết và thực hiện cuộc gọi từ xa. Nếu mọi thứ đang chạy trong quá trình, khía cạnh sẽ chỉ chuyển tiếp cuộc gọi địa phương. Về phía callee, khía cạnh sẽ loại bỏ dữ liệu, thực hiện cuộc gọi cục bộ và trả về kết quả.

Bây giờ hãy để tôi kể cho bạn một câu chuyện nhỏ về những thứ "tầm thường" như đầu ra nhật ký: Chỉ vài tuần trước tôi đã tái cấu trúc một cơ sở mã phức tạp nhưng không quá lớn (khoảng 250K dòng mã) cho một khách hàng. Trong vài trăm lớp, một loại khung đăng nhập đã được sử dụng, trong vài trăm lớp khác. Sau đó, có vài ngàn dòngSystem.out.println(*)nơi thực sự cần phải có đầu ra đăng nhập. Vì vậy, tôi đã kết thúc với việc sửa hàng ngàn dòng mã nằm rải rác trong cơ sở mã. May mắn thay tôi có thể sử dụng một số thủ thuật thông minh trong IntelliJ IDEA (tìm kiếm & thay thế cấu trúc) để tăng tốc toàn bộ hành động, nhưng bạn không nghĩ nó là chuyện nhỏ! Chắc chắn, ghi nhật ký gỡ lỗi phụ thuộc mạnh vào ngữ cảnh sẽ luôn xảy ra trong thân phương thức, nhưng nhiều loại ghi nhật ký quan trọng như theo dõi các cuộc gọi phương thức (thậm chí phân cấp với đầu ra thụt vào độc đáo), ghi nhật ký cả ngoại lệ được xử lý hoặc không xử lý, kiểm tra người dùng (ghi nhật ký cuộc gọi phương pháp hạn chế dựa trên vai trò người dùng) và vv có thể dễ dàng được thực hiện ở các khía cạnh mà không làm ô nhiễm mã nguồn. Nhà phát triển ứng dụng hàng ngày không cần phải suy nghĩ về nó hoặc thậm chí nhìn thấy các cuộc gọi logger nằm rải rác trên cơ sở mã.

Tôi có thể đưa ra những lời giải thích tương tự cho các mối quan tâm xuyên suốt khác. Giữ mã sạch và không bị phân tán và rối IMO là vấn đề chuyên nghiệp, không phải bất cứ điều gì tùy chọn. Cuối cùng nhưng không kém phần quan trọng, nó giữ cho mã có thể đọc được, có thể duy trì, có thể tái cấu trúc. Amen.


0

Mối quan tâm xuyên suốt là các tình huống phải luôn luôn xuất hiện bất kể loại ứng dụng.

Ví dụ: Ghi nhật ký, Bảo mật, Hồ sơ hiệu suất, Bản địa hóa, Khả năng truy cập, Giao dịch, v.v. Không phân biệt phần mềm chúng tôi đang xây dựng ghi nhật ký (nếu không, một số người sẽ gỡ lỗi hoặc lấy một số thông tin liên quan từ dữ liệu prod). Bảo mật (xác thực / ủy quyền, v.v.) là cần thiết khi chỉ người dùng xác thực mới có thể nhập vào ứng dụng với quyền đặc quyền. Chúng tôi cần biết ứng dụng của bạn hoạt động như thế nào thì chúng tôi cần phải lập hồ sơ. Trong trường hợp ứng dụng được sử dụng bởi người dùng quốc tế (với ngôn ngữ địa phương của riêng họ), thì chúng ta cần hỗ trợ tương tự trong ứng dụng. Khả năng truy cập là trường hợp khả dụng cho người khuyết tật sử dụng ứng dụng của chúng tôi.

Bây giờ Bất kể ứng dụng của chúng tôi có dựa trên máy tính để bàn, dựa trên web, v.v. nếu người dùng Cuối cần sử dụng trên toàn bộ địa lý trong môi trường sản xuất thì cần phải cắt giảm. Cho đến bây giờ tôi chưa nói gì về ứng dụng là gì, v.v., nhưng đưa ra danh sách các mối quan tâm cần được giải quyết trước khi phát hành cho người dùng cuối trong môi trường sản xuất. và đó là tất cả về mối quan tâm xuyên suốt (cần được xử lý bởi tất cả các ứng dụng / phương pháp / lớp tức là ở các cấp độ khác nhau).

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.