Các tập tin cấu hình bên ngoài được coi là một antipotype?


8

Nhiều lần tôi đã ở trong một tình huống mà một ứng dụng rõ ràng bị hỏng, chỉ để thấy rằng một tệp cấu hình bên ngoài đã bị lỗi. Thông thường, điều này là do tập tin sai ở đó hoặc nó chứa dữ liệu không chính xác.

Có cách nào tốt hơn để cho phép người dùng / quy trình bên ngoài sửa đổi các đặc điểm thời gian chạy của ứng dụng hay đây là giải pháp được biết đến nhiều nhất cho vấn đề?

Tôi muốn xem thảo luận về trường hợp chung thay vì tập trung vào, giả sử, Unix /etc hoặc Java JNDI, v.v.


2
Làm thế nào khác bạn có thể cấu hình test / dev / live / môi trường sống khác nhau? Quan điểm của tôi là lựa chọn duy nhất - sẽ luôn có sự phụ thuộc bên ngoài.
NimChimpsky

5
Bất cứ điều gì bạn có sẽ là bên ngoài. Vấn đề bạn gặp phải không phải là cấu hình bên ngoài, mà nó được quản lý và hiểu rất tệ.
Oded

2
Nhưng đó là điều - các tập tin cấu hình có xu hướng được quản lý hoặc hiểu kém.
Telastyn

4
Đối với "tệp sai" - có một kỹ thuật Unixish tuyệt vời: sử dụng trình bao bọc tập lệnh để bắt đầu nhị phân của bạn, đặt tất cả các biến môi trường cấu hình cục bộ. Bằng cách này, nó luôn rõ ràng về cấu hình mà bạn đã chọn.
SK-logic

1
"Thay thế" là 99% tham số cấu hình là tùy chọn. Cần có giá trị mặc định hợp lý. Khi cấu hình cần tệp chuyên dụng của riêng nó và trở nên dài hơn mã thực thi, điều đó cho tôi biết rằng khả năng cấu hình vượt xa tính hữu dụng. Hãy tưởng tượng nếu bạn cần 35 tham số được chỉ định trước khi bạn có thể chạy curl.
Sridhar Sarnobat

Câu trả lời:


13

Hầu hết các ứng dụng sẽ yêu cầu một số cấu hình bên ngoài; bạn có thể che giấu điều này bằng cách làm cho nó phụ thuộc vào các biến ma thuật hoặc bằng cách lưu nó vào một số vị trí nội bộ, nhưng điều đó sẽ không loại bỏ nhu cầu. Mục tiêu là nhận ra những gì nên bên ngoài, và những gì có thể là nội bộ. Chỉ có thể kiểm tra các bộ phận nội bộ.

Một ứng dụng không nên tin tưởng một tập tin cấu hình bên ngoài là chính xác. Nó sẽ kiểm tra tính chính xác, và báo cáo lỗi. Nếu ứng dụng không thể kiểm tra tệp cấu hình, có lẽ bạn đang làm quá nhiều với nó. Nếu tập tin cấu hình thay đổi hành vi của ứng dụng, theo ý kiến ​​của tôi thì nó không nên ở bên ngoài.

Ví dụ, tên người dùng / mật khẩu cơ sở dữ liệu có thể dễ dàng được ứng dụng xác minh bằng cách cố gắng kết nối với cơ sở dữ liệu. Nếu điều này không thành công, nó có thể báo cáo nó, và rõ ràng đó không phải là một lỗi trong mã ứng dụng. Tương tự, đối với đường dẫn tệp, sự tồn tại và quyền truy cập có thể được kiểm tra.

Bây giờ, nếu bạn đã đặt các truy vấn SQL trong tệp cấu hình, thì ứng dụng không thể dễ dàng kiểm tra tính chính xác của các truy vấn đó. Điều tương tự cũng xảy ra đối với một tệp đặc tả tiêm phụ thuộc đầy đủ (một tệp Java-Spring XML). Những người không nên ở trong các tập tin cấu hình bên ngoài.

Nhưng nếu cấu hình được chỉ định mô tả một cái gì đó bên ngoài và bạn có thể nhanh chóng kiểm tra tính chính xác của nó, tôi không nghĩ có gì sai với các tệp cấu hình bên ngoài.

Chỉnh sửa: cũng đảm bảo báo cáo lỗi của bạn hiển thị tệp cấu hình nào được sử dụng. Không có gì khó chịu hơn việc phát hiện ra bạn đang xem sai tập tin sau nhiều giờ cố gắng tìm ra điều gì sai với nó.


4
+1 cho đề xuất xác thực nội bộ - chắc chắn phải hoàn thành mẫu
Gary Rowe

6

Tôi sẽ phân loại chúng như là một "khu vực có vấn đề" hơn là một phản mẫu. Trừ khi bạn sẽ triển khai một cấu hình cố định, bạn sẽ phải lưu trữ thông tin cấu hình ở đâu đó . Tôi thường thích lưu trữ hầu hết thông tin cấu hình của mình trong cơ sở dữ liệu, nhưng bạn vẫn phải lưu trữ thông tin kết nối cơ sở dữ liệu ở đâu đó. Tôi thích cách tiếp cận Java / Spring trong việc lưu trữ thông tin cấu hình trong chính cấu trúc ứng dụng, hơn là (nói) trong thư mục chính của người dùng hoặc sổ đăng ký Windows, nhưng đó chỉ là sở thích cá nhân.


5

Các tập tin cấu hình bên ngoài KHÔNG phải là một mô hình chống. Giống như mọi thứ khác, chúng có thể được sử dụng tốt hoặc kém tùy thuộc vào hệ thống được đề cập.

Bạn dường như đã chạy vào một số ứng dụng trong đó cấu hình bên ngoài có thể phá vỡ ứng dụng mà không cho người dùng biết điều gì đang xảy ra. Điều đó thật tệ, nhưng đó không phải là lỗi của các tệp cấu hình, đó là lỗi của bất kỳ ai quyết định phần nào trong tệp cấu hình và phần nào trong ứng dụng và cách xử lý lỗi trong số đó.


4

Theo ý kiến ​​của tôi: KHÔNG , các tệp cấu hình bên ngoài không phải là một antipotype.

Nó chỉ là một kỹ thuật một mô hình kiến ​​trúc để quản lý sự phức tạp của phần mềm.

Trong thời đại của các nguyên tắc thiết kế RẮN, bạn đã chuyển độ phức tạp của phần mềm từ Monolithic_application sang các mô-đun độc lập hơn phải được cắm với nhau.

thay thế cho "tập tin cấu hình bên ngoài" sẽ là cấu hình các mô-đun trực tiếp bằng mã.


Các mẫu không bị giới hạn trong mã - một tệp cấu hình bên ngoài là một mẫu kiến ​​trúc chứ không chỉ đơn thuần là một kỹ thuật.
Gary Rowe

4

Nếu bất cứ điều gì, di chuyển cấu hình từ logic sang dữ liệu được ưa thích. Nó cho phép bạn làm cho ứng dụng linh hoạt hơn mà không cần phải làm lại mã của bạn. Thiếu tệp dữ liệu là một trường hợp quá ít tài liệu hoặc công việc cẩu thả khi cài đặt hơn là một thực tiễn xấu về mã hóa IMHO.


Tôi đồng ý rằng các tuyên bố khai báo là một cách trực tiếp hơn, dễ hiểu hơn để chỉ định các thuộc tính và hành vi (ở một mức độ). +1.
William Payne

3

Làm cho công cụ SCM yêu thích của bạn thực hiện nhiệm vụ kép như một công cụ CM: ​​Đặt các tệp cấu hình của bạn vào kho lưu trữ. Để thay đổi cấu hình, hãy cam kết các thay đổi và để các công cụ triển khai tự động của bạn đẩy chúng ra sản xuất (tất nhiên sau khi chạy một loạt các thử nghiệm tự động!)

Et Voila! bạn có bản ghi tất cả các thay đổi về cấu hình, cộng với mạng lưới an toàn bổ sung của hệ thống kiểm tra / CI tự động!

Như đã được chỉ ra trước đây, các mẫu kiến ​​trúc & thiết kế không chỉ giới hạn trong chính hệ thống sản phẩm, mà còn mở rộng cho nhóm / quy trình / hệ thống giúp sản xuất nó.


1
+1 cho một chiến lược triển khai hữu ích - khá nhiều cách Heroku thực hiện nó với các dự án GitHub.
Gary Rowe

Bạn phải đảm bảo các cấu hình của bạn không ở cùng một repo với mã của bạn vì các hiệu ứng trên việc phân nhánh và gắn thẻ cho các bản phát hành.
dietbuddha

1
Tôi không đồng ý. Các cấu hình thực sự nên ở cùng một repo với mã. Tôi tin rằng một sự thay đổi sản xuất thành một tệp cấu hình là một lý do hợp lệ để thực hiện một cam kết (ví dụ) một nhánh thẻ Svn. Lợi ích chính là bạn có thể nhìn vào một nơi (kho lưu trữ) để xem mọi thứ (càng nhiều càng tốt) có thể ảnh hưởng đến sản xuất. Dễ dàng hơn nhiều để đuổi theo gremlins và lỗi nếu bạn biết nơi để tìm mọi thứ. (Đặc biệt nếu bạn đang sử dụng một cái gì đó như Graphite để lập biểu đồ cam kết với các số liệu và cảnh báo về hiệu suất)
William Payne
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.