Tôi sẽ nói chủ yếu từ quan điểm của việc sử dụng trừu tượng để cách ly mã ứng dụng từ một khung đăng nhập cụ thể. Có những yếu tố khác có thể ảnh hưởng đến việc lựa chọn khung đăng nhập của một người hoặc lựa chọn của một (và yêu cầu) một trừu tượng.
Tôi đã dành rất nhiều thời gian gần đây để đánh giá các khung đăng nhập khác nhau cũng như trừu tượng khai thác gỗ của bên thứ ba.
Một số người cảm thấy có giá trị trong việc cách ly mã ứng dụng của họ từ một khung đăng nhập cụ thể. Bạn sẽ tìm thấy nhiều bài viết ở đây trên SO giống như this và this và this (và còn nhiều nữa), nơi ghi nhật ký được thảo luận và nhiều người coi nó như một vấn đề tất nhiên là khung công tác ghi nhật ký phải được bao bọc/trừu tượng.
Rõ ràng, điều này cho phép bạn không bị ràng buộc với một khuôn khổ cụ thể. Điều này có quan trọng không? Bạn có bao giờ thực sự chuyển đổi khung đăng nhập của mình không? Vâng, cũng có rất nhiều người hoặc không đề cập đến gói hoặc những người đề nghị chống lại nó. Nếu bạn xem xét một số ví dụ về mã gói khung đăng nhập đã được đăng ở đây, bạn cũng có thể thấy nhiều ví dụ về lý do tại sao ít nhất một số người không nên quấn khung đăng nhập của họ!
Nếu bạn đã bắt đầu một dự án gần đây, bạn có thể đã kiểm tra khung công tác ghi nhật ký và, có lẽ, đã thu hẹp nó xuống hai vòng chung kết: log4net và NLog. Mỗi người đều có lập luận ủng hộ. log4net rõ ràng là một yêu thích, có lẽ là yêu thích của những người đã bày tỏ ý kiến. NLog cung cấp khả năng rất giống nhau. Được đánh giá bởi sự nổi tiếng, log4net có thể là sự lựa chọn rõ ràng. Dựa trên khả năng, chúng có vẻ rất giống nhau. Dựa trên "hoạt động gần đây" (như được chỉ định bởi các kiểm tra để mã nguồn của họ repostories bởi hoạt động blog hoặc thiếu thị trưởng), NLog là sự lựa chọn rõ ràng. Nếu bạn phải chọn một năm trước, bạn có thể đi với log4net vì nó sẽ là sự lựa chọn "an toàn". Không rõ khi nào NLog phát hành. Trong năm kể từ đó, NLog đã trải qua một chu kỳ phát triển khá đáng chú ý, phát hành phiên bản beta chỉ vài ngày trước.
Chọn năm nào trước? Lựa chọn nào bây giờ? Là một lựa chọn rõ ràng hơn sau đó? Là một sự lựa chọn tốt hơn bây giờ?
Một điều trừu tượng giúp bạn là khả năng đưa ra quyết định chọn người nào (bạn thậm chí không nhất thiết phải chọn EVER, mặc dù bạn có thể muốn nếu bạn định cung cấp khung ghi nhật ký với sản phẩm). Bạn có thể kiểm tra ổ đĩa và cái kia và cảm nhận cách chúng hoạt động với ứng dụng của bạn, với nhóm của bạn, trong môi trường của bạn. Sử dụng một cái gì đó như Common.Logging hoặc SLF cho phép bạn bắt đầu viết mã ngay bây giờ, mã hóa cho một số giao diện đăng nhập/API và nhận mã đăng nhập của bạn tại chỗ. Nếu bạn tin rằng giao diện/API được cung cấp bởi sự trừu tượng là đủ cho công việc của bạn (và, tại sao nó không phải vì nó cơ bản giống như giao diện/API được cung cấp bởi log4net và NLog), thì không có nhiều nguy hiểm trong việc sử dụng sự trừu tượng. Khi bạn trải qua chu kỳ phát triển, bạn có thể thấy rằng một khung công tác hoặc một khuôn khổ khác phù hợp hơn với nhu cầu của bạn. Có mã hóa để trừu tượng, bạn được tự do để thực hiện lựa chọn đó tại bất kỳ điểm nào, cho đến khi sản phẩm của bạn ra khỏi cửa.
Bạn thậm chí có thể suy nghĩ, trong suy nghĩ của bạn, rằng bạn có thể có thể viết một thư viện đăng nhập từ đầu. Một lần nữa, nếu bạn tin rằng giao diện/API của log4net và/hoặc NLog là đủ, bạn có thể triển khai thư viện đăng nhập của bạn với một API tương tự. Nếu bạn tin rằng, đó có thể là một lý do khác để sử dụng một trừu tượng. Một lần nữa, bạn có thể bắt đầu viết mã (cho sản phẩm của bạn, không phải thư viện đăng nhập của bạn) ngày hôm nay, đăng nhập với một số khung khai thác gỗ khác cho đến khi thư viện đăng nhập "từ đầu" của bạn sẵn sàng. Có lẽ bạn thực sự muốn sử dụng System.Diagnostics.TraceSource và Ukadc.Diagnostics (để có được khả năng định dạng đầu ra tương tự như log4net hoặc NLog) để bạn có thể tích hợp "tốt hơn" với nhật ký mà Microsoft đã triển khai trong một số nền tảng của họ bằng cách sử dụng TraceSources. Nó có thể được khá dễ dàng để viết một "logger" về TraceSources và sau đó viết trừu tượng để bạn có thể cắm nó vào Common.Logging hoặc SLF. (Nếu giao diện/API là đủ, bạn chỉ có thể viết "logger" của bạn về giao diện của thư viện trừu tượng và không phải viết thêm một lớp trừu tượng).
Với các đối số thuyết phục như vậy, tại sao mọi người sẽ KHÔNG sử dụng trừu tượng? Ha ha, đùa thôi!
Nếu trừu tượng là tốt, bạn có nên viết của riêng mình hoặc sử dụng tài liệu hiện có không? Nếu bạn viết một mình, thì rõ ràng bạn phải viết nó. Làm thế nào để làm điều này? Vâng, bạn có thể chỉ cần xác định một giao diện và bọc một khuôn khổ (cẩn thận và bọc nó một cách chính xác!). Sau đó, nếu bạn quyết định muốn chuyển đổi, hãy đóng khung đó.Nếu bạn cẩn thận, bạn không phải thay đổi bất kỳ mã ứng dụng nào, ngoại trừ có thể là nơi bạn thực sự tạo các đối tượng của khung bên dưới. Có lẽ điều này là tốt. Bạn đã tránh sự phụ thuộc vào một số sự trừu tượng của bên thứ ba đối với giá "nhỏ" của việc triển khai một trình bao bọc đơn lẻ trên một khung công tác duy nhất. Tuy nhiên, có một chi phí. Cho đến khi bạn đã viết trừu tượng của bạn, bạn không thể viết rất nhiều mã ứng dụng đã đăng nhập vào nó, trừ khi bạn có một chiến lược tốt để thay đổi nó thành trừu tượng của bạn. Nó cũng trở nên khó khăn hơn để kiểm tra lái xe hai hoặc nhiều khung để quyết định cái nào hoạt động tốt hơn cho bạn. Mỗi khung mà bạn muốn "thử" yêu cầu một công việc quấn khác. Nếu bạn muốn chuyển đổi giữa các khung công tác một cách dễ dàng (ít nhất là trong chu trình phát triển), bạn phải làm việc để làm cho nó dễ dàng. Khung bên thứ ba cung cấp khung này.
Wow! Bây giờ tôi đã bán! Hãy cho tôi đăng nhập trừu tượng, hoặc cho tôi cái chết!
Ghi nhật ký khai thác tất cả nước thịt? Có nhược điểm nào không? Họ không thể tuyệt vời, phải không?
Vâng, như mọi khi, khi "mua" thứ gì đó hoặc khi nhận được thứ gì đó miễn phí, bạn sẽ có được những gì có sẵn. Logging abstractions không khác nhau. Cả Common.Logging lẫn SLF đều không trưng ra ít nhất một bộ các khả năng rất quan trọng của log4net/NLog - các khả năng ngữ cảnh ghi nhật ký (GDC, MDC, NDC). Đây có thể là chìa khóa để nhận thông tin đầy đủ được ghi lại và định dạng để cho phép bạn nhận được nhiều giá trị nhất từ của bạn. SLF không cung cấp một trừu tượng TraceSource. Nó cũng không cung cấp các hàm IsXXXEnabled. Common.Logging cung cấp một trừu tượng TraceSource. Castle.Logging KHÔNG hiển thị GDC/MDC/NDC cho log4net và NLog. Nó cũng cung cấp một trừu tượng TraceSource. Sự trừu tượng hóa của TraceSource của Castle cũng tăng cường việc ghi nhật ký TraceSource bằng cách cung cấp khả năng đặt tên "phân cấp", tương tự như khả năng của log4net và NLog. Nó trông khá tuyệt!
Ngoài ra, các dự án này đều là nguồn mở của một biểu mẫu này hoặc biểu mẫu khác. Vì vậy, tùy thuộc vào sự trừu tượng, các nhà phát triển có thể có nhiều hơn hoặc ít hơn một quan tâm có lợi trong việc giữ cho nó được cập nhật và thêm các tính năng mới. Common.Logging đã trải qua một vài phiên bản và được sử dụng, AFAIK, trong Spring.Net. Dường như hoạt động hợp lý, ít nhất là trong lịch sử. Castle.Logging được sử dụng trong khuôn khổ Castle. Vì vậy, họ dường như có khách hàng "thực sự" và đang sử dụng "thế giới thực", hy vọng sẽ thúc đẩy nhiều tính năng triển khai hơn. SLF, theo như tôi có thể nói, không được sử dụng như là một phần của một nền tảng phát triển "thực sự", do đó rất khó để biết nó được thực hiện bao nhiêu.
Không rõ lộ trình dành cho các nền tảng này là gì. Common.Logging có một số tính năng sắp tới được liệt kê trên trang web của họ, nhưng không hiển thị rõ ràng khi chúng có sẵn. Trang web nói "Tháng Sáu", nhưng năm nào? Danh sách gửi thư được giám sát bao lâu một lần? Đối với SLF, tần suất của codeplex được giám sát như thế nào? Ưu tiên của các dự án "miễn phí" này so với các công việc trả lương của nhà phát triển ở đâu? Bạn có thể đủ khả năng cho một số bên thứ ba trừu tượng để thực hiện một tính năng mà bạn cần? Họ sẽ tiếp nhận được nếu bạn thực hiện một cái gì đó và sau đó gửi lại để xem xét để được bao gồm trong sản phẩm? Ngoài ra, tất cả các nguồn cho tất cả các abstractions này đều có sẵn, vì vậy bạn chỉ có thể chịu trách nhiệm cho nó và thực hiện bất kỳ sửa chữa hoặc thêm bất kỳ cải tiến mà bạn, mà không cần phải đi qua thời gian và năng lượng của tạo ra một sự trừu tượng từ đầu. Bạn có thích Common.Logging nhưng thực sự muốn log4net/NLog GDC/MDC/NDC? Nhận triển khai của Castle và thêm nó vào Common.Logging. Thì đấy! Bản tóm tắt khai thác có chứa gần 100% API đăng nhập log4net/NLog. Bạn có thích SLF nhưng muốn nó có IsXXXEnabled? Không có nhiều công việc để thực hiện điều đó. Hãy tiếp tục và sử dụng GDC/MDC/NDC trong khi bạn đang ở đó. Bạn có thích Castle? (Tôi không quen thuộc với nó, không chắc chắn nó dễ sử dụng bên ngoài lâu đài như thế nào, nếu vấn đề đó quan trọng) Hãy cẩn thận, tôi đã không sử dụng nó, nhưng nhìn vào nguồn trên git, nó trông giống như logger NLog trừu tượng có thể không giữ lại thông tin trang web cuộc gọi.
Có đạo đức khi tham gia nhiều dự án nguồn mở và kết hợp chúng để tạo một dự án "siêu" (để bạn sử dụng hoặc của công ty bạn)? Có phải là xấu để có Common.Logging và tăng cường nó với việc thực hiện GDC/MDC/NDC của Castle? Tôi không biết. Tôi sẽ để người khác trả lời.
Tôi sắp hoàn thành ...
Một số trừu tượng khai thác gỗ của bên thứ ba cung cấp các khả năng khác. Bạn có thể sử dụng một thư viện được thực hiện trong điều khoản của, nói log4net. Bạn có thể không muốn sử dụng log4net, hoặc ít nhất có thể không muốn bị ràng buộc với nó. Common.Logging (và có thể SLF) giúp bạn dễ dàng nắm bắt các thông điệp ghi log4net và định tuyến lại chúng thông qua sự trừu tượng để chúng được ghi lại trong luồng ghi nhật ký của khung khai thác cơ bản của trừu tượng. SLF có thể cung cấp một cái gì đó tương tự. Tất nhiên, bạn có thể có thể làm một cái gì đó tương tự với khung công tác khai thác hiện có, hoặc là ra khỏi hộp hoặc bằng cách viết một tùy chỉnh log4net Appender, NLog Target, hoặc System.Diagnostics TraceListener. Các tính năng này đã không sôi nổi lên rất cao trong đánh giá cụ thể của tôi về việc có hay không sử dụng sự trừu tượng khai thác gỗ của bên thứ ba trong dự án của tôi bởi vì tôi chủ yếu quan tâm đơn giản trong khía cạnh trừu tượng.
Vì vậy, tôi nên đứng ở đâu? Tôi nghĩ rằng có giá trị trong việc giữ mã ứng dụng của bạn được cách ly từ một khung khai thác gỗ cụ thể. Với tôi, Common.Logging trông giống như một sự lựa chọn trừu tượng vững chắc, mặc dù một số tính năng quan trọng bị thiếu (GDC/MDC/NDC) và nó không tương thích với Silverlight. Nó sẽ tuyệt vời của những tính năng đã trở thành có sẵn sớm. Tôi cảm thấy thoải mái khi triển khai GDC/MDC/NDC nếu tôi phải làm như vậy. Làm cho nó tương thích Silverlight có lẽ sẽ mất nhiều công sức hơn, chủ yếu là bởi vì tôi không đặc biệt có kinh nghiệm với C# /. NET/Silverlight. Cho đến khi những vấn đề đó được giải quyết, chúng tôi sẽ có thể viết nhiều mã ứng dụng với Common.Logging tại chỗ. Chúng ta có thể dành nhiều thời gian để phát triển ứng dụng của chúng ta hơn là phát triển một thư viện khai thác gỗ hoặc thư viện trừu tượng khác. Nếu chúng ta cuối cùng phải thêm những tính năng còn thiếu, chúng ta sẽ phải làm rất nhiều điều đó nếu chúng ta đã thực hiện một thư viện khai thác hoặc thư viện trừu tượng.
http://www.joelonsoftware.com/articles/fog0000000018.html –
@brian Tôi không chắc chắn giả định của bạn về khuynh hướng tự nhiên của mọi người là đúng sự thật. Nhấn mạnh hầu hết các nhà phát triển thậm chí không nghĩ về nó. – Howiecamp