Đầu tiên, tôi đọc một đoạn trích của Edsger W. Dijkstra năm 1974 "Về vai trò của tư tưởng khoa học":
Hãy để tôi cố gắng giải thích cho bạn, những gì theo sở thích của tôi là đặc trưng cho tất cả những suy nghĩ thông minh. Đó là, người ta sẵn sàng nghiên cứu sâu về một khía cạnh của vấn đề của một người để cô lập vì sự nhất quán của chính mình, tất cả thời gian biết rằng người ta chỉ chiếm giữ bản thân mình với một trong những khía cạnh. Chúng tôi biết rằng một chương trình phải chính xác và chúng tôi chỉ có thể nghiên cứu nó từ quan điểm đó; chúng tôi cũng biết rằng nó sẽ hiệu quả và chúng tôi có thể nghiên cứu hiệu quả của nó vào một ngày khác, có thể nói như vậy. Trong một tâm trạng khác, chúng tôi có thể tự hỏi mình liệu, và nếu vậy: tại sao, chương trình là mong muốn. Nhưng không có gì đạt được ngược lại! - bằng cách giải quyết các khía cạnh khác nhau này cùng một lúc. Đó là điều mà đôi khi tôi đã gọi là "sự tách biệt các mối quan tâm", mà, ngay cả khi không hoàn toàn có thể, vẫn là kỹ thuật duy nhất có sẵn để sắp xếp hiệu quả những suy nghĩ của một người mà tôi biết. Đây là điều tôi muốn nói bằng cách "tập trung sự chú ý của một người vào một khía cạnh nào đó": nó không có nghĩa là bỏ qua các khía cạnh khác, nó chỉ thực sự công bằng với thực tế là từ quan điểm của khía cạnh này, khía cạnh khác là không liên quan. Nó đang được suy nghĩ một và nhiều theo dõi cùng một lúc.
Tôi thấy sự phân tách hiện đại của các mối quan tâm nói về việc mô đun hóa mã của bạn. Tuy nhiên, đọc đoạn trích dẫn trên, tôi hiểu điều này như tập trung tâm trí của bạn vào một nhiệm vụ cụ thể tại một thời điểm, trong khi không tập trung vào các khía cạnh khác. Điều này không có nghĩa với tôi nhất thiết là mã cần phải được tách thành các khối mô-đun.
Đó là, giả sử có một mã trước mặt bạn rằng trong một tệp có các khái niệm về chế độ xem, kho lưu trữ, bộ điều khiển, xử lý sự kiện, nhà máy, v.v ... tất cả trong một tệp.
Ví dụ ngắn gọn, đây là một số mã có quyền truy cập dữ liệu và chế độ xem (đầu ra):
$sql = "SELECT * FROM product WHERE id = " . db_input($id);
$row = db_fetch_array(db_query($sql));
<option value="<?=$row['id']?>"<?= $row['ver'] == $row['ver'] ? ' selected="selected"' : '' ?>>Version <?=$row['ver']?></option>
Sử dụng OO hiện đại Tôi có thể đặt quyền truy cập dữ liệu vào tệp riêng của mình bằng mẫu Kho lưu trữ, mã Xem có thể đi vào mẫu tệp của chính nó và tôi có thể kết nối chúng với nhau để liên lạc qua bộ điều khiển (hoặc Trình xử lý hành động hoặc yêu cầu) và tôi có thể thêm một nhà máy để tạo và kết nối các phụ thuộc khác nhau. Và tôi có thể có một tập tin cấu hình xác định các nhà máy đó. Chắc chắn đó là một bước đi từ tất cả các tập tin duy nhất.
Câu hỏi của tôi về việc phân tách các mối quan tâm là như vậy: đọc trích dẫn của Dijkstra, tôi có một ý tưởng rằng có lẽ anh ta không nhất thiết phải phân tách các mối quan tâm là "tách mã theo mô-đun (thành các tệp hoặc các chức năng / phương thức / v.v." của họ), " và rằng anh ta có ý nghĩa nhiều hơn để tập trung tâm trí của một người vào một khía cạnh của chương trình, mà không phải gánh nặng tập trung vào các khía cạnh quan trọng khác nhưng chưa được xem xét, bất kể họ có bị tách biệt về mặt vật lý hay không.
Tại sao sau đó chúng ta phải gánh nặng với các mẫu thiết kế và phân tách mã mô-đun vật lý? Sẽ không đủ để chỉ tập trung vào một khía cạnh, bất kể mã của bạn được cấu trúc như thế nào?
Tôi không nói về việc viết ra mã spaghetti khủng khiếp nhất và sau đó chỉ xem xét một khía cạnh của nó, đó có thể sẽ là một gánh nặng. Nhưng cuối cùng, điều tôi sẽ hướng tới là tại sao lại thực hiện phân tách mã vật lý, tại sao lại chia mã thành các tệp hoặc khối riêng biệt (phương thức), khi không cần thiết phải tập trung tinh thần vào một khía cạnh?
Có nên tách các mối quan tâm vẫn là một bài tập tinh thần, hơn là thể chất?
Nói cách khác, có nên có sự ngắt kết nối giữa các khía cạnh tinh thần (tập trung vào) và các khía cạnh vật lý (mã trên giấy) của lập trình?
IF
, WHILE
, FOR
thay vì GOTO
. Modular = các mô-đun với API công khai được xác định rõ ràng tách biệt với việc triển khai và biểu diễn bên trong ẩn. (Ví dụ: Modula, Mesa, Modula-2, Modula-3, phương ngữ Pascal sau này ( UNIT
).)