Sử dụng OOP trong các chủ đề


36

Tôi thấy rất nhiều plugin sử dụng mã hóa hướng đối tượng khi không thực sự cần thiết.

Nhưng điều tồi tệ hơn nữa là các nhà phát triển chủ đề đang bắt đầu làm điều tương tự. Các chủ đề thương mại và các chủ đề phổ biến miễn phí như Suffusion, thậm chí là chủ đề yêu thích của tôi - Kết hợp, nhét tất cả các chức năng của chúng vào trong một lớp, khởi tạo nó một lần trong hàm.php và chạy các chức năng của nó theo cách thủ tục :)

Wtf? Quan điểm của việc này là gì? Rõ ràng là bạn sẽ không sử dụng hai hoặc nhiều phiên bản của cùng một chủ đề cùng một lúc.

Chúng ta hãy giả sử rằng các plugin làm điều này cho không gian tên (thật vô lý), nhưng lý do chủ đề là gì? Tui bỏ lỡ điều gì vậy?

Lợi thế của việc mã hóa một chủ đề như thế này là gì?


5
@ Ammebious Amoeba - Bạn có thể giải thích lý do tại sao bạn tin rằng việc sử dụng các lớp cho plugin để giảm thiểu xung đột không gian tên là vô lý? Đối với các chủ đề, có thể nó cũng hữu ích nếu bạn có thể đưa ra ví dụ về những gì bạn cho là mã tốt trong các chủ đề và những gì bạn đang xem là không cần thiết. Thảo luận về điều này trong bản tóm tắt không có khả năng đạt được bất kỳ cái nhìn sâu sắc nào cho bạn hoặc cho người khác, đặc biệt là những người khác không quen thuộc với những gì bạn đang đề cập đến.
MikeSchinkel

1
Tôi sử dụng các lớp bất cứ nơi nào tôi có thể cá nhân, nó dễ dàng hơn nhiều để tôi duy trì, cập nhật và tái sử dụng. Bỏ qua sở thích cá nhân, những lý do tốt nào để sử dụng một lớp học?
t31os

1
Kì lạ, vừa mất bình luận ban đầu của tôi (có lẽ lỗi SE?) .. tôi sẽ nhắc lại, mặc dù vậy, lý do chính đáng nào để không sử dụng một lớp học?
t31os

2
@MikeSchinkel: bạn có thể làm điều đó bằng cách nối thêm tiền tố vào tên hàm. Tôi không nghĩ rằng nó đáng giá cho lớp học thêm chỉ để có tên chức năng tốt. Dù sao, tôi tò mò về lý do tại sao các chủ đề làm điều này, không nhiều về các plugin
onetrickpony

4
@ Ammebious Amoeba - Tôi chắc chắn sẽ cho rằng bạn có quyền đối với ý kiến ​​của mình, nhưng ý kiến ​​của tôi thì khác. Tôi tin rằng sự rõ ràng mà các lớp mang lại cho mã bằng cách giảm thiểu các hàm trôi nổi trong không gian tên toàn cầu là giá trị mà tôi tin là một lượng vô cùng hiệu quả của chi phí bổ sung, đặc biệt là khi sử dụng IDE cấp độ chuyên nghiệp như PhpStorm. Và các lớp tạo ra một đơn vị độc lập để nhà phát triển có thể biết mô-đun yêu cầu mã nào. Và cuối cùng sau khi phát triển phong cách plugin WordPress của tôi để sử dụng các lớp, bất kỳ phương thức nào khác chỉ cảm thấy với tôi như mã hóa cẩu thả.
MikeSchinkel

Câu trả lời:


26

Tôi có thể hiểu sự nhầm lẫn của bạn dựa trên ví dụ bạn cung cấp. Đó thực sự là một cách kém để sử dụng một lớp ... và chỉ vì một lớp được sử dụng, không tạo ra một hệ thống OOP.

Trong trường hợp của Hybrid, họ chỉ sử dụng một lớp để đặt tên cho các hàm của chúng. Xem xét Hybrid là một khung chủ đề , điều này được thực hiện để các chủ đề con có thể sử dụng lại tên hàm mà không cần nhà phát triển phải lo lắng về xung đột tên. Trong nhiều trường hợp, một khung chủ đề (chủ đề gốc) rất phức tạp, nhiều nhà phát triển chủ đề con sẽ không bao giờ hiểu chính xác những gì diễn ra dưới mui xe.

Nếu Hybrid không sử dụng cấu trúc lớp, các nhà phát triển chủ đề con sẽ cần biết tất cả các lệnh gọi hàm hiện có là gì để họ có thể tránh sử dụng lại tên. Và đúng vậy, bạn chỉ có thể tiền tố tất cả các chức năng của mình bằng một con sên duy nhất, nhưng điều đó làm cho mã khó đọc, khó bảo trì và vốn không thể tái sử dụng nếu bạn phát triển các hệ thống khác muốn sử dụng cùng chức năng.

Để trả lời câu hỏi của bạn

Wtf? Quan điểm của việc này là gì? Rõ ràng là bạn sẽ không sử dụng hai hoặc nhiều phiên bản của cùng một chủ đề cùng một lúc.

Không, bạn sẽ không sử dụng hai hoặc nhiều phiên bản của cùng một chủ đề. Nhưng như tôi đã nói, hãy nghĩ về cấu trúc lớp trong trường hợp này như là đặt tên cho các hàm, không tạo ra một thể hiện đối tượng truyền thống. Kết hợp mọi thứ lại với nhau trong một lớp và khởi tạo nó để gọi phương thức ( myClass->method();) hoặc gọi phương thức trực tiếp ( myClass::method();) là một cách rất rõ ràng để sắp xếp không gian tên mọi thứ theo cách có thể đọc lại được.

Tất nhiên, bạn luôn có thể sử dụng một cái gì đó giống như myClass_method();thay vào đó, nhưng nếu bạn muốn sử dụng lại bất kỳ mã nào trong một chủ đề khác, trong một trình cắm thêm hoặc trong khung antoher, bạn phải quay lại và thay đổi tất cả các tiền tố của bạn. Giữ mọi thứ trong một lớp sạch hơn và cho phép bạn phát triển lại và triển khai lại nhanh hơn nhiều.

Chúng ta hãy giả sử rằng các plugin làm điều này cho không gian tên (thật vô lý), nhưng lý do chủ đề là gì? Tui bỏ lỡ điều gì vậy?

Trong phần lớn các tình huống tôi đồng ý với bạn. Tuy nhiên, phần lớn đó đang nhanh chóng suy yếu. Tôi lưu trữ một số trang web trên bản cài đặt MultiSite sử dụng các biến thể của cùng một chủ đề. Thay vì tạo lại cùng một chủ đề lặp đi lặp lại với những khác biệt nhỏ, tôi có một "lớp" duy nhất cho chủ đề chính và tất cả các chủ đề con mở rộng lớp đó. Điều này cho phép tôi xác định chức năng tùy chỉnh cho từng trang web trong khi vẫn duy trì cảm giác đồng nhất chung trên toàn bộ mạng.

Một mặt, các nhà phát triển chủ đề có thể chọn cách tiếp cận dựa trên lớp để không gian tên chức năng của họ (điều này không vô lý nếu bạn làm việc trong môi trường nơi bạn sử dụng lại nhiều đoạn mã giống nhau). Mặt khác, các nhà phát triển chủ đề có thể chọn cách tiếp cận dựa trên lớp để dễ dàng mở rộng theo các chủ đề con.

Lợi thế của việc mã hóa một chủ đề như thế này là gì?

Nếu bạn chỉ sử dụng Hybrid trên trang web của mình, có rất ít lợi thế để biết bạn là người dùng cuối. Nếu bạn đang xây dựng một chủ đề con cho Hybrid, có những lợi thế từ không gian tên và khả năng mở rộng. Nếu bạn làm việc cho ThemeHy điều chỉnh , lợi thế nằm ở việc tái sử dụng mã nhanh chóng, hiệu quả trên các dự án khác của bạn (Prototype, Leviathan, v.v.).

Và nếu bạn là nhà phát triển chủ đề thích một tính năng cụ thể của Hybrid nhưng không phải toàn bộ chủ đề, thì lợi thế nằm ở việc tái sử dụng mã nhanh chóng, hiệu quả trong dự án không kết hợp của bạn (giả sử đó cũng là GPL).


Tôi không đồng ý với phần "mở rộng". Bạn có cùng mức độ kiểm soát đối với chủ đề gốc như bạn sẽ sử dụng nếu bạn đã sử dụng các hành động và các chức năng điển hình của mình. Tại sao? Bạn tự nói điều đó, đây không phải là OOP đúng. Tôi cũng không đồng ý với việc đặt tên - đây là lý do tại sao tôi bắt đầu câu hỏi này ở vị trí số 1 - Hãy thử xác định lại bất kỳ chức năng nào từ Hybrid trong bất kỳ plugin nào và bạn sẽ thấy rằng các chức năng sẽ va chạm. Tại sao bạn nghĩ rằng họ vẫn thêm tiền tố? :) Bạn không thể bao bọc toàn bộ chủ đề trong một lớp, nó không có ý nghĩa gì cả ...
onetrickpony

Tôi không nói rằng không sử dụng OOP trong các chủ đề, như một số người ở đây có thể đã hiểu, ngược lại (xem 2.8 widget ví dụ như, người đi bộ, v.v.), nhưng không như thế này.
onetrickpony

1
Có vẻ như bạn gặp vấn đề với việc triển khai cụ thể của Hybrid, không phải với việc sử dụng OOP trong các chủ đề hoặc thậm chí sử dụng một lớp để không gian tên các chức năng được xác định trong một chủ đề. Tôi đã cố gắng trả lời các câu hỏi rộng hơn của bạn lại: tại sao làm điều này? và re: những lợi thế của việc này là gì? Tôi sẽ không dành thời gian để bảo vệ những gì dường như là một triển khai nửa vời hoặc tranh cãi với sự thù địch rõ ràng của bạn đối với cấu trúc của khung chủ đề cụ thể. Tóm lại, nếu bạn không thích cách xây dựng của Hybrid, hãy sử dụng thứ khác.
EAMann

1
hoàn toàn không, tôi thích Hybrid (nhưng tất nhiên không phải là thứ đẳng cấp). Hybrid đã khiến tôi phải tạo ra khung chủ đề của riêng mình. Lấy một ví dụ khác, Suffusion, cùng loại thực hành. Một lần nữa, các không gian tên trong trường hợp này không hoạt động với các chủ đề, tất cả các chức năng trong lớp trình bao bọc sẽ luôn xung đột với các plugin, bởi vì các plugin được tải bởi các chủ đề "trong" của WP.
onetrickpony

1
Đủ công bằng. Chỉ cần cố gắng ghi nhớ rằng hầu hết các công việc WP không bắt đầu bằng OOP (vì WP không), nhưng đặt các phương thức chủ đề trong một lớp để bắt chước cách nó được thực hiện trong một trình cắm ít nhất là một bước đúng hướng ... ngay cả khi đó là một lớp học được hình thành một nửa và được thực hiện kém. Tôi chắc chắn đồng ý rằng chỉ gói mọi thứ trong một lớp và gọi mọi thứ theo thủ tục là hơi kỳ lạ (và không hữu ích từ POV của nhà phát triển bên thứ 3 đang cố gắng sử dụng hệ thống). Nhưng nếu được thực hiện một cách chính xác (và trong Hybrid thì rõ ràng là không), việc mã hóa lớp của bạn functions.phpcó thể rất mạnh mẽ.
EAMann

29

Tốc độ

Chủ đề cơ sở hiện tại của tôi có 13 lớp. Khi tôi xây dựng một chủ đề mới, tôi hoặc sử dụng các lớp này như chúng hoặc tôi mở rộng chúng. Hệ thống đó làm cho quá trình xây dựng một chủ đề mới rất, rất nhanh.

Phạm vi chặt chẽ

Tôi hiếm khi cần các biến toàn cục, bởi vì mọi thứ mà mã của tôi phải biết được ẩn trong các thành viên của lớp. Vì vậy, tôi có thể chia sẻ một biến giữa hai bộ lọc hoặc hành động rất khác nhau mà không có nguy cơ va chạm với các plugin được viết kém.

Bảo trì

Mỗi lớp là một tập tin. Nếu tôi cần cập nhật chủ đề của khách hàng, tôi chỉ cần cập nhật một số tệp. Bất cứ điều gì xảy ra bên trong các lớp là tùy thuộc vào tôi miễn là tôi cung cấp cùng một API.

Một ví dụ: phía trên comment_form();cuộc gọi, tôi sử dụng một hành động đơn giản:

do_action( 'load_comment_class' );
comment_form();

Lớp bình luận nào sẽ được tải quyết định bộ điều khiển của tôi. Chính xác những gì xảy ra bên trong lớp bình luận quyết định lớp cá nhân.

Hãy thử điều này với một cách tiếp cận thủ tục thuần túy và bạn sẽ trở nên điên rồ. :)

Dễ đọc

Sẽ dễ dàng hơn nhiều để đọc lại và hiểu mã của riêng bạn vài tháng sau nếu bạn tách mọi thứ theo nhiệm vụ của nó.

Một số ví dụ cho hệ thống phân cấp lớp hữu ích

  • Meta_Box-> được mở rộng bởi Shortdesc_Meta_BoxSimple_Checkbox_Meta_Box-> được mở rộng bởiSidebar_Switch
  • User_Profile_Addon-> được gia hạn bởi User_Profile_Checkbox(xem Câu hỏi 3255 )
  • Comment_Form -> kéo dài bởi {$theme_name}_Comment_Form

1
Bất kỳ cơ hội để có được các lớp 'chủ đề' của bạn? Tôi muốn viết riêng của tôi và tôi muốn biết làm thế nào bạn làm điều đó.
Horttcore

1
Tôi chưa quyết định điều này. Có lẽ tôi đang thực hiện một chủ đề cơ sở mới cùng với @bueltge vào năm tới, sử dụng một số các lớp này. Rất có thể không phải trước khi diễu hành, tôi sợ.
fuxia

5
Đặc biệt đối với các trường hợp của bạn, các chủ đề và khung miễn phí, OOP là con đường để đi. Những người khác phải làm việc với các mã này. Các tác giả nên làm cho quá trình này dễ dàng và linh hoạt nhất có thể. Thay thế một lớp dễ dàng hơn thay thế 20 hàm, bởi vì một lớp được viết tốt có API được xác định rõ ràng.
fuxia

2
Tôi không thể nói bất cứ điều gì về Hybrid; tôi chưa bao giờ sử dụng nó Nhưng, vâng, một bộ điều khiển tổ chức mọi thứ đằng sau màn cửa, cung cấp các bộ lọc tốt và chèn một số mô hình MVC vào mớ hỗn độn chủ đề thông thường - là Điều tốt. Đừng tin tôi. Thử nó. :)
fuxia

3
Đã đến lúc, WordPress cần một chủ đề OOP cho các nhà phát triển; tôi hy vọng chúng ta sẽ dành thời gian để làm việc cho mục tiêu của mình. Đoạn trích nhỏ này ở đây và những lợi ích cho thấy những khả năng tuyệt vời với chủ đề khách hàng; một cách nhanh chóng để nhận ra một chủ đề mới ans cũng tuyệt vời để bảo trì.
bueltge

3

Một điểm khác để xem xét: Tốc độ.

if ( !class_exists('cccYourClassName') )  
// VERSUS  
if ( !function_exists('ccc_your_function_name') )

Sau khi xem / in ra, tôi tìm thấy ~ 1.700 chức năng nội bộ và ~ 1.400 chức năng người dùng = ~ 3.100 / 3.200 chức năng VS. ~ 250 Lớp. Tôi đoán điều này nói lên nhiều nhất về việc cần phải tìm kiếm bao nhiêu. Nếu bạn gọi !function_exists('')khoảng 50 - 100 chức năng trong chủ đề của mình ... chỉ cần đặt hẹn giờ cho một chức năng và sau đó bắt đầu thực hiện một số phép toán. Ngay cả khi nó không OOP, đó là một cách tốt để tạo mã

1) có thể tái sử dụng
2) có thể duy trì
3) có thể trao đổi
4) nhanh hơn một chút

Khi bạn xem các lớp khác nhau trôi nổi trên web giúp bạn thực hiện các hộp meta, widget, v.v. nhanh chóng, thì thật tốt khi sử dụng bộ điều khiển như @toscho đã đề cập, bởi vì bạn có thể chỉ cần cắm các lớp ra và vào và chỉ cần thay thế một số dòng trong bộ điều khiển xử lý các lớp của bạn.


2

Một số ý kiến ​​cho rằng đóng gói là lợi ích duy nhất (hoặc ít nhất là chính) mà OOP mang lại, và sự kế thừa và trạng thái nằm ở đâu đó giữa nhàm chán và xấu xa:

http://obiecte.blogspot.com/2008/09/oop-sucks.html

Tác giả đã nói nhiều hơn về việc sử dụng các lớp / đối tượng như các cấu trúc hơn là các thùng chứa cho các hàm tĩnh, nhưng thật thú vị khi đọc một câu hỏi hoàn toàn khác về câu hỏi, từ một người nằm ngoài trại OOP.

Tôi có thể viết Plugin WordPress tiếp theo của mình trong Haskell.


1
Thật không may, blog chỉ mở cho người dùng "được mời". Chỉ cần một lời nhắc nhở khác tại sao chúng ta không bao giờ nên đăng thông tin của mình trên một dịch vụ miễn phí và thay vào đó, nên lưu trữ blog của chính chúng ta. Facebook rất giống nhau về vấn đề này. Một liên kết tài nguyên được cập nhật sẽ tốt đẹp. FWIW Tôi đã thấy mặt tối của OOP và sẽ không bao giờ sử dụng nó nữa trừ khi nó thực sự cần thiết trong bối cảnh, vì các hàm bậc cao hơn thường có thể mở rộng chức năng và giúp giảm nồi hơi và lạm dụng classtừ khóa.
Josh Habdas

2

Oh khá là thảo luận! Tôi phải thừa nhận rằng tôi sử dụng các lớp để đóng gói thường xuyên hơn không. Ý tưởng ở đây là trong các plugin của tôi, tôi có thể gói các hàm của mình trong một lớp và trong lớp đó sử dụng các tên phương thức rất đơn giản, có ý nghĩa chung chung ngay cả trong các plugin khác mà tôi viết. Trong trường hợp đó, các lớp là một thay thế cho các không gian tên, mà tôi buộc phải tránh trong các môi trường 5.2.x.

Mặc dù có một vài trường hợp rằng OOP hữu ích cho tính mô đun, hành động đơn giản bao bọc các chức năng của bạn cũng tạo ra phần thưởng bổ sung cho khả năng mở rộng của plugin chéo. Ví dụ, gần đây tôi đã mở rộng một giải pháp lập hóa đơn dựa trên lớp và để tôi có thể mở rộng lớp chính, thêm mã bổ sung cho các chức năng khác nhau (w / Parent :: cuộc gọi) hoặc thậm chí thay thế các chức năng, mà không cần nội bộ hóa plugin mở rộng.

Mặc dù vậy, lớp bọc cho hầu hết các phần chỉ là một thay thế cho không gian tên.


-4

Điểm phàn nàn về mã bạn không viết là gì?

Nếu bạn không thích mã, hãy tự viết!

Đơn giản. Vấn đề được giải quyết.

Các lập trình viên thích làm công cụ theo cách của họ. Vì vậy, đừng cho rằng bạn có thể nói cho họ biết cách viết mã, uống loại rượu whisky nào, loại thuốc lá nào để hút thuốc hay theo tôn giáo nào. Họ sẽ chỉ gỡ lỗi diatribe như vậy và tiếp tục làm những gì họ muốn. ;-)

Mã không phải là thơ. Code là một biến thể của bài hát "My Way" của Sinatra ...


10
Câu hỏi này không phàn nàn về mã, nó yêu cầu một lời giải thích rõ ràng về lý do tại sao mã sẽ được viết theo một cách cụ thể. Phần lớn lõi WP là thủ tục, với một vài tính năng mới hơn sử dụng phương pháp OOP. Nhiều trình cắm hiện đại cũng sử dụng OOP để đóng gói chức năng. Nhưng hầu hết các chủ đề không. OP đã hỏi tại sao một cách tiếp cận giả OOP sẽ được sử dụng và lấy Hybrid làm ví dụ. Bạn không trả lời câu hỏi, bạn đang ca ngợi.
EAMann
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.