Kiến trúc tốt (gọn gàng) trong lập trình một trang web đơn giản, ví dụ như một cuốn sách liên lạc là gì?


28

Khi tôi xây dựng một trang web đơn giản, ví dụ: sổ liên lạc nơi tôi có thể thêm, xóa và cập nhật danh bạ, tôi tạo một index.phptệp nơi người dùng, nếu anh ta không đăng nhập, được yêu cầu nhập mật khẩu và nếu anh ta nhập đúng mật khẩu, anh ta được chỉ định một phiên và có thể làm một số điều với các liên hệ.

Tôi có hai tệp:

  1. ( contacts.php) Đầu tiên là cho mã HTML được hiển thị. Trên mã HTML tôi bao gồm tệp thứ hai và tạo lớp.
  2. Thứ hai ( contacts_class.php) chứa tất cả các phương thức để thêm, xóa và cập nhật.

Tôi nghĩ điều đó ổn, nhưng khi thực hiện một dự án lớn, tôi nên làm thế nào? Tôi có phải tạo thư mục cho mỗi trang và đặt các tệp vào chúng (như ở trên, HTML và lớp) không, và tôi nên làm như thế nào? Một kiến ​​trúc tốt và gọn gàng để xây dựng các dự án lớn mà mọi lập trình viên khác sẽ hiểu một cách hoàn hảo là gì?

Câu trả lời:


67

Bạn đưa ra một câu hỏi rất thú vị và cơ bản. Câu hỏi liên quan đến kiến ​​trúc dự án quy mô lớn và tổ chức cấu trúc thư mục (là thứ yếu của kiến ​​trúc).

Ngày nay, cách tiếp cận phổ biến nhất để xây dựng kiến ​​trúc khung CMS là sử dụng mẫu MVC. Có một số bài viết hay về xây dựng khung MVC của riêng bạn, một trong số đó là Xây dựng khung MVC với PHP .

MVC là viết tắt của Model, View, Controller. Bạn có thể gọi những cách tiếp cận này bất cứ điều gì bạn thích - MVC, HMVC, MVP. Bản chất là cô lập các thành phần riêng lẻ trong hệ thống của bạn. "Trình điều khiển" lấy dữ liệu từ "Mô hình" và gửi chúng đến "Chế độ xem", kết xuất lại HTML cuối cùng. Bạn đã thực hiện "V" trong contacts.phpvà "MC" trong của bạn contacts_class.php. Vì vậy, bạn đã tách biệt khung nhìn khỏi mô hình và bộ điều khiển. Bây giờ bạn có thể dễ dàng thay đổi "Chế độ xem" của mình để nguyên các phần khác.

Tôi không đề nghị bạn mù quáng theo mô hình MVC, MVP hay bất cứ thứ gì khác "MV". Đó là vấn đề của sự phù hợp, hiệu quả và hương vị.

Ứng dụng trang web động phổ biến có thể bao gồm các thành phần như:

  • Điểm vào, nói index.php
  • Các thư viện / lớp trợ giúp
  • Bộ định tuyến yêu cầu
  • Các mô-đun, thành phần hoặc bộ điều khiển
  • Công cụ mẫu hoặc có thể là các chế độ xem đơn

Ứng dụng web thực sự có thể bao gồm bất kỳ thành phần nào khác như trình xử lý sự kiện, trình điều khiển sự kiện và hook, nhưng thực tế đây là những sắc thái. Vâng, hãy để tôi trình bày nó theo cách tôi muốn trình bày nó:

Sơ đồ quy trình hoạt động

Quy trình hoạt động khung chung như sau:

  1. Yêu cầu trình duyệt được gửi trực tiếp đến điểm thực thi / script ( index.php).
  2. Kịch bản điểm nhập tải các thư viện trợ giúp, các lớp và thực hiện một số khởi tạo tiếp theo của môi trường lập trình của chúng tôi.
  3. URL được chuyển đến thể hiện của bộ định tuyến yêu cầu. Bước này có thể là một phần của bước 2.
  4. Bộ định tuyến yêu cầu phân tích cú pháp URL và gửi hoạt động đến một thành phần, mô-đun hoặc bộ điều khiển cụ thể.
  5. Thành phần (hoặc bộ điều khiển) xử lý yêu cầu được định tuyến và gửi dữ liệu đến dạng xem được hiển thị.

Cấu trúc thư mục dự án tương ứng được hiển thị trong sơ đồ.

Tôi sẽ đề nghị bạn điều tra làm thế nào các khung công tác khác được thực hiện. Các CMS / khung được đề xuất để bắt đầu là CodeIgniter, OpenCart, Joomla 1.5 và Tango CMS.


3
Bạn đã sử dụng gì để tạo ra hình ảnh đó? Câu trả lời chính xác!
Đánh dấu Tomlin

3
Cảm ơn bạn đã đánh giá tích cực câu trả lời của tôi! Tôi rất trân trọng điều này! Câu trả lời này hoàn toàn là kết quả của việc phân tích các khung ứng dụng web nguồn mở khác nhau, mà tôi đã tiến hành trước đó cho chính mình. Đối với những người quan tâm đến cách tạo hình ảnh và phần mềm đang được sử dụng, hình ảnh được tạo bằng Inkscape 0.48 và GIMP 2.6.10. Không vấn đề gì với điều đó. Chỉ cần sử dụng hai lớp: một cho hình chữ nhật có chữ, một lớp cho bóng (hình chữ nhật màu đen mờ). Tôi đoán bạn hiểu phần còn lại?

Một câu hỏi, tại sao bạn lại tách bộ điều khiển 'danh bạ' thành 3 tệp. Sẽ không sạch sẽ hơn khi kết hợp chúng thành một contact.php. Tất cả bạn phải làm là vượt qua trong một tham số hành động từ bộ định tuyến. Điều tương tự cũng có thể được nói cho các chế độ xem 'danh bạ' trừ khi chế độ xem của bạn trộn lẫn khuôn mẫu và logic vào một tệp cho mỗi hành động. Tôi không làm nhiều dev trong PHP (tôi làm việc chủ yếu bằng Python) nhưng tôi hy vọng rằng không phải tất cả các khung công tác đều sử dụng phương pháp này. Nếu không +1 cho một bài viết tuyệt vời.
Evan Plaice

2

Để có được ý tưởng về những câu hỏi cần hỏi và giải pháp nào có sẵn, tôi giới thiệu cuốn sách Kiến trúc mô hình ứng dụng doanh nghiệp của Martin Fowler. Bạn có thể biết được những gì trong cuốn sách bằng cách đọc trang web của anh ấy

Xin lưu ý rằng cuốn sách đã khá cũ (trong lĩnh vực CNTT) nhưng nhiều nguyên tắc vẫn còn hiệu lực hoặc bạn nên học chúng để học hỏi. (Điều đó có ý nghĩa không?)

(Phần mềm) Kiến trúc là một chủ đề rất rộng, đừng mong đợi một viên đạn bạc mà luôn có nhiều câu hỏi và nghi ngờ nhiều hơn cho đến khi hết thời gian và tiền bạc và bạn phải gắn bó với giải pháp tốt nhất cho đến nay.


2

Trước hết, hãy xem dự án phát triển tốt. Wordpress là một ví dụ rất gọn gàng về cấu trúc mã: hiểu đơn giản nhưng cung cấp rất nhiều "phích cắm". Vì vậy, wordpress rất dễ dàng để đánh giá thông qua "plug in".

Thứ hai, một cách rất dễ dàng để kiểm tra kiến ​​trúc của bạn đang cố gắng viết bài kiểm tra đơn vị. Chẳng hạn, nếu lớp "Card Deck" có phương thức "shuffle ()", bạn phải có thể tạo một Card Card có kích thước được xác định trước (ví dụ 5 thẻ 1,2,3,4,5), gọi shuffle và xác minh trong một cách dễ dàng kết quả (id 1,4,2,5,3)

Bạn phải có thể làm điều đó mà không cần khởi tạo toàn bộ các lớp dự án và bài kiểm tra phải rất sạch sẽ để đọc.

Nếu bạn không thể làm điều đó, bạn phải thêm các lớp giữa các lớp, cơ cấu lại chúng, cho đến khi bạn có được một cách dễ dàng để làm điều đó.

Sau đó, sắp xếp lại bước này cho tất cả các lớp cốt lõi của dự án của bạn.

Cuối cùng nhưng không kém phần quan trọng: một kiến ​​trúc sư giỏi có thể "lười biếng" đối với các lớp không cốt lõi (đó là vấn đề của nền kinh tế: những thứ được thiết kế rất tốt có giá quá cao trong thế giới thực).


1

Một kiến ​​trúc tốt cho các dự án quy mô lớn là MVC (Model View Controller): http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93 điều khiển

Tuy nhiên, liệu các lập trình viên khác có hiểu nó là một vấn đề hoàn toàn khác hay không. MVC có thể trở nên phức tạp và đôi khi quá mức cần thiết cho các dự án nhỏ. Một trong những lợi ích của nó là quy mô dễ dàng.


Đó là một mô hình, không phải là một kiến ​​trúc.
Halfdan

Tôi tranh luận rằng họ là một trong cùng một trường hợp này. Làm thế nào bạn sẽ phân biệt hai? Ngoài ra, đọc dòng đầu tiên của trang Wikipedia tôi đã đăng.
Chris Laplante

1
Từ kinh nghiệm của tôi, MVC không phức tạp và cũng rất hữu ích trong các dự án nhỏ. Tuy nhiên, tôi đồng ý rằng đó là một mô hình chứ không phải toàn bộ kiến ​​trúc.
Daniel Varod

MVC là một mô hình, không phải kiến ​​trúc mỗi se, nhưng nó có thể được coi là một phần của kiến ​​trúc. Và nó không quá phức tạp.

1

Nếu tôi hiểu chính xác câu hỏi của bạn, bạn đang nói về cấu trúc thư mục dự án và về cơ bản không phải là một kiến ​​trúc. Nếu sự hiểu biết của tôi là chính xác, hãy đọc tiếp; khác chỉnh sửa câu hỏi của bạn hoặc đặt một nhận xét và tôi sẽ chỉnh sửa câu trả lời của tôi cho phù hợp.

Trong khi thiết kế một ứng dụng, sau khi trả lời một số câu hỏi cơ bản như (cái gì? Và cho ai?), Chúng ta cần xác định các thành phần và phân loại chúng dựa trên chức năng \ trách nhiệm. Có hai cách chính mà tôi biết. Bạn có thể phân loại các thành phần dựa trên, sử dụng các trường hợp chúng xử lý (như đăng nhập, tìm kiếm, v.v.) hoặc phân loại dựa trên Tài nguyên (Đối tượng ..). Cách thứ nhất được gọi là Hướng hoạt động và cách thứ hai được gọi là Định hướng tài nguyên. Theo truyền thống, hầu hết các ứng dụng phân loại các thành phần dựa trên Hoạt động (vì các nhà thiết kế đã tìm thấy nó, dễ dàng trong khi chuyển từ miền có vấn đề sang miền giải pháp). Nhưng tôi lạc đề.

Khi phân loại thành phần được xác định, sau đó chúng ta cần xác định phân loại dựa trên tầng. Một ứng dụng web thông thường sẽ có Cấp xem, Cấp mô hình và Cấp điều khiển (MVC). Tất nhiên có thể có nhiều ứng dụng phức tạp hơn. (hầu hết các ứng dụng trong thế giới thực phức tạp hơn, đơn giản hơn).

Sau khi xác định hai nguyên tắc phân loại này, tôi sẽ tạo các thư mục cấp cao nhất Xác định từng tầng. (UI, Bộ điều khiển, Dịch vụ, Ứng dụng, v.v.). Trong mỗi thư mục cấp cao, tôi sẽ tạo các thư mục con dựa trên Chức năng hoặc Tài nguyên (Dự án - / EditProject - / SearchProject, v.v.). Phân loại chức năng lý tưởng sẽ là đa cấp.


Tôi chưa đi sâu hơn vào sự khác biệt giữa Thiết kế hướng tài nguyên và Thiết kế hướng hoạt động. Ngoài việc lạc đề, tôi không chắc lắm về câu hỏi. Nhưng cá nhân khi nói đến sự rõ ràng của thiết kế (nhà phát triển mới có thể hiểu các thành phần và thiết kế cơ bản dễ dàng như thế nào), Kiến trúc định hướng tài nguyên là tốt hơn. Chỉ cần nhìn vào hệ thống phân cấp thư mục, nhà phát triển có thể hiểu toàn bộ tài nguyên tham gia và tài nguyên phụ và hoạt động trên mỗi tài nguyên cũng thống nhất.

1

Có kiến ​​trúc tốt và kiến ​​trúc xấu, tuy nhiên không có đạn bạc. Một kiến ​​trúc phải phù hợp với các yêu cầu hiện tại và rất có thể trong tương lai.

Một hướng dẫn tốt sẽ là, đảm bảo rằng mỗi phần của ứng dụng có thể được thay đổi với hiệu quả tối thiểu trên các phần khác và mỗi phần đều có các bài kiểm tra tích hợp và đơn vị bảo hiểm đầy đủ tự động.


1

Kiến trúc là về việc đảm bảo bạn có thể tiếp tục phát triển trong dài hạn. Đối với các ứng dụng lớn hơn, điều này bao gồm việc đánh đổi giữa việc làm cho mọi thứ trở nên độc lập để nhiều người có thể làm việc đồng thời và tránh trùng lặp (DRY) để dự án có thể duy trì nhanh chóng. Các dự án PHP có xu hướng tập trung vào việc làm cho mọi thứ trở nên độc lập và có số lượng lớn trùng lặp.

Để có được cảm giác tốt cho vị trí cực đoan khác, hãy nhìn vào bờ biển


1

Nếu bạn không biết cách cấu trúc một dự án lớn, bạn nên mượn thiết kế / kiến ​​trúc của người khác bằng cách sử dụng một trong một số Khung PHP tốt. Tôi muốn giới thiệu CakePHP, CodeIgniter hoặc Symfony. Tất cả những thứ này đều thực hiện một Model, View, Controller, MVC patten hoạt động tốt trong phát triển web, chúng đều khá nhẹ và dễ học.

Khi bạn đã biết một trong những khung này, bạn có thể ở vị trí kiến ​​trúc sư cấu trúc của riêng bạn cho dự án cụ thể của bạn, nhưng nếu bạn chỉ mới bắt đầu, tôi sẽ đứng trên công việc của người khác so với phát minh lại bánh xe.


0

MVC là kiến ​​trúc được sử dụng phổ biến nhất, được chứng minh để giải quyết hầu hết các vấn đề. Một kiến ​​trúc tốt sẽ có các tính năng sau (và hơn thế nữa, orcference)

  1. Nó có thể được thử nghiệm
  2. Tách biệt mối quan tâm
  3. Nhiều người sẽ có thể làm việc trên nó mà không có bất kỳ va chạm nào.
  4. Nó có thể được mở rộng mà không có nhiều vấn đề
  5. Nó có thể được mở rộng. Khi nói đến các dự án lớn khả năng mở rộng sẽ là một mối quan tâm lớn. Kiểm tra khung Kohana , được viết tốt và có thể được thu nhỏ rất tốt

0

trước khi bạn viết bất kỳ mã sản xuất nào cũng mất 2 tuần (đêm :) và đọc cuốn sách này. Nó sẽ thay đổi suy nghĩ của bạn trong một thời gian dài về kiến ​​trúc lập trình, sơ đồ và đóng gói.

Nguyên tắc, mô hình và thực tiễn nhanh nhẹn C # của Prentice Hall

Các ví dụ có trong C # nhưng chúng rất dễ đọc không phải là về cách viết cú pháp mã chính xác mà là về cách suy nghĩ như một lập trình viên.

Tôi hứa bạn sẽ lưu nó vào vị trí đáng tin cậy nhất trên máy tính của bạn và bạn sẽ ngạc nhiên rằng bạn đã lập trình mà không biết về nó. Nó sẽ thay đổi suy nghĩ của bạn.

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.