Використання OOP у темах


36

Я бачу дуже багато плагінів, що використовують об'єктно-орієнтоване кодування, коли це насправді не потрібно.

Але ще гірше - розробники тем починають робити те саме. Комерційні теми та безкоштовні популярні теми, такі як Suffusion, навіть моя улюблена тема - Hybrid, заповнюють усі їх функції всередині класу, інстанціюють його один раз у function.php та виконують його функції процедурно :)

Wtf? Який сенс робити це? Очевидно, ви не будете використовувати два чи більше екземплярів однієї теми одночасно.

Припустимо, що плагіни роблять це для простору імен (що смішно), але в чому тема виправдання? Я щось пропускаю?

Яка перевага кодування такої теми?


5
@Ambitious Amoeba - Чи можете ви пояснити, чому ви вважаєте, що використовувати класи для плагінів для мінімізації зіткнень у просторі імен? Щодо тем, можливо, було б також корисно, якби ви могли навести приклади того, що ви вважаєте хорошим кодом у темах, і що ви вважаєте непотрібним. Якщо обговорити це в рефераті, швидше за все, не вдасться зрозуміти ні вас, ні інших, особливо тих, хто не знайомий з тим, про що ви маєте на увазі.
MikeSchinkel

1
Я використовую заняття, де я особисто можу, мені набагато простіше підтримувати, оновлювати та використовувати повторно. Особисті переваги осторонь, які вагомі причини для використання заняття?
t31о

1
Як не дивно, тільки що я втратив свій оригінальний коментар (SE помилка, можливо?) .. Я повторю це, хоча які вагомі причини для того, щоб не використовувати клас?
t31о

2
@MikeSchinkel: це можна зробити, додавши до імені функції префікс. Я не думаю, що варто зайвого класу, щоб мати гарні назви функцій. У всякому разі, мені цікаво, чому теми роблять це, не так багато плагінів
onetrickpony

4
@Ambitious Amoeba - я, безумовно, скажу, що ти маєш право на свою думку, але моя думка відрізняється. Я вважаю, що чіткість, яку класи вносять до коду, зводячи до мінімуму функції, що плавають у глобальному просторі імен, варта того, що, на мою думку, є фактично незмірною кількістю додаткових накладних витрат, особливо при використанні IDE професійного рівня, наприклад PhpStorm. І класи створюють автономний блок, щоб розробник міг знати, який код вимагає модуль. І нарешті, після розвитку мого стилю плагіну WordPress для використання класів, будь-який інший метод мені здається недбалим кодування.
MikeSchinkel

Відповіді:


26

Я можу зрозуміти вашу плутанину на основі прикладу, який ви надали. Це дійсно поганий спосіб використання класу ... і лише тому, що використовується клас, не створюється OOP системи.

У випадку з гібридом вони просто використовують клас для простору імен своїх функцій. Зважаючи на те, що Hybrid є тематичною основою , це робиться для того, щоб дочірні теми могли повторно використовувати імена функцій, без розробника не турбуватися про зіткнення імен. У багатьох випадках тематична рамка (батьківська тема) настільки складна, що багато розробників дитячої теми ніколи не зрозуміють, що саме відбувається під кришкою.

Якщо Hybrid не використовував структуру класів, розробникам дочірньої теми потрібно було б знати, що всі існуючі виклики функцій, щоб вони могли уникнути повторного використання імен. І так, ви можете просто встановити всі свої функції за допомогою унікального слугу, але це робить код важким для читання, важким для обслуговування та за своєю суттю не повторним використання, якщо ви розробляєте подальші системи, які хочуть використовувати той самий функціонал.

Щоб відповісти на ваші запитання

Wtf? Який сенс робити це? Очевидно, ви не будете використовувати два чи більше екземплярів однієї теми одночасно.

Ні, ви не будете використовувати два чи більше екземплярів однієї теми. Але, як я вже сказав, подумайте про структуру класу в даному випадку як про розширення імен функцій, а не про створення традиційного об'єкта. Збирати все разом у класі та або примушувати його до методів виклику ( myClass->method();), або до виклику методів безпосередньо ( myClass::method();) - це дуже чистий спосіб ідентифікувати речі з простору імен у читаному, багаторазовому використанні.

Звичайно, ви завжди можете використовувати щось на кшталт myClass_method();цього, але якщо ви хочете повторно використовувати будь-який з цього коду в іншій темі, в плагіні або в антогерній рамці, вам доведеться повернутися назад і змінити всі свої префікси. Зберігати все в класі більш чисто і дозволяє переробити та перерозподілити набагато швидше.

Припустимо, що плагіни роблять це для простору імен (що смішно), але в чому тема виправдання? Я щось пропускаю?

У більшості ситуацій я погодився б із вами. Однак ця більшість швидко згасає. Я розміщую кілька сайтів на установці MultiSite, які використовують варіанти однієї теми. Замість того, щоб заново створювати одну і ту ж тему з незначними відмінностями, у мене є один "клас" для батьківської теми, і всі дочірні теми поширюють цей клас. Це дозволяє мені визначати спеціальні функціональні можливості для кожного сайту, зберігаючи загальне відчуття рівномірності у всій мережі.

З одного боку, розробники тем можуть обрати на основі класу підхід до простору імен щодо їх функціональності (що не смішно, якщо ви працюєте в середовищі, де ви знову і знову використовуєте шматки одного і того ж коду). З іншого боку, розробники тем можуть обрати підхід на основі класу для легкого розширення по дочірній тематиці.

Яка перевага кодування такої теми?

Якщо ви використовуєте на своєму сайті лише гібрид, переваги для вас як кінцевого користувача мало. Якщо ви будуєте дочірню тему для Hybrid, є переваги щодо простору імен та розширення. Якщо ви працюєте на ThemeHybrid , перевага полягає в швидкому та ефективному використанні коду для інших ваших проектів (прототип, левіафан тощо).

І якщо ви розробник тем, який любить специфічну особливість Hybrid, але не всю тему, перевага полягає у швидкому та ефективному використанні коду у вашому негібридному проекті (якщо це також GPL).


Я не згоден з частиною "розширюваності". Ви маєте такий самий рівень контролю над батьківською темою, як і у випадку, коли б ви використовували дії та свої типові функції. Чому? Ви самі це сказали, це неправда OOP. Я також не згоден з простором імен - саме тому я запустив це питання на 1-му місці - Спробуйте перевзначити будь-яку функцію від Hybrid в будь-якому плагіні, і ви побачите, що функції будуть стикатися. Як ви думаєте, чому вони все ще додали префікси? :) Ви просто не можете
зафіксувати

Я не кажу, щоб не використовувати OOP у темах, як це могли зрозуміти деякі люди тут (навпаки (див. 2.8 віджети, наприклад, ходунки тощо), але не так.
onetrickpony

1
Схоже, у вас є проблеми зі специфічною реалізацією Hybrid, а не з практикою використання OOP у темах або навіть використання класу для простору імен функцій, визначених у темі. Я намагався відповісти на ваші більш широкі запитання щодо: чому це робити? і знову: які переваги робити це? Я не збираюся витрачати жодного часу на захист того, що видається напівсерйозною реалізацією чи сперечається проти вашої очевидної ворожнечі до конкретної структури рамки теми. Підсумок, якщо вам не подобається, як побудований Hybrid, використовуйте щось інше.
EAMann

1
зовсім не мені подобається гібрид (але, звичайно, не клас). Гібрид спонукав мене створити власну тематичну рамку. Візьмемо інший приклад, «Суфузія», такий самий вид практики. Знову-таки, простори імен в цьому випадку не працюють з темами, всі функції класу обгортки завжди будуть конфліктувати з плагінами, оскільки плагіни завантажуються WP "всередині" тем.
onetrickpony

1
Досить справедливо. Постарайтеся пам’ятати, що більшість WP-робіт не починається з OOP (оскільки WP не є), але тематичні методи в класі, що імітують, як це робиться в плагіні, - це принаймні крок праворуч напрям ... навіть якщо це напівзадуманий і погано реалізований клас. Я, безумовно, погоджуюся, що просто загортати все в класі та називати речі процедурно - це не дивно (і не корисно з POV стороннього розробника, який намагається використовувати систему). Але якщо зробити все правильно (а в Hybrid - це, мабуть, не так), клас-ifying вашого коду functions.phpможе бути дуже потужним.
EAMann

29

Швидкість

Моя поточна основна тема має 13 класів. Коли я будую нову тему, я або використовую ці класи такими, якими вони є, або розширюю їх. Ця система робить процес побудови нової теми дуже, дуже швидким.

Тугі сфери застосування

Мені рідко потрібні глобальні змінні, тому що все, що повинен знати мій код, приховано у членів класу. Тож я маю змогу поділити змінну між двома дуже різними фільтрами чи діями без ризику зіткнення з погано записаними плагінами.

Технічне обслуговування

Кожен клас - один файл. Якщо мені потрібно оновити тему клієнта, я просто оновлюю деякі файли. Що б не трапилося всередині класів, залежить від мене, якщо я пропоную той самий API.

Приклад: над comment_form();викликом я використовую просту дію:

do_action( 'load_comment_class' );
comment_form();

Який клас коментарів буде завантажений, вирішує мій контролер. Що саме відбувається всередині класу коментарів, визначає індивідуальний клас.

Спробуйте це з чистим процедурним підходом, і ви зіпсуєтеся. :)

Читабельність

Так набагато простіше перечитати і зрозуміти власний код через кілька місяців, якщо ви розділили все своїм завданням.

Деякі приклади корисних ієрархій класів

  • Meta_Box-> розширено на Shortdesc_Meta_Boxі Simple_Checkbox_Meta_Box-> продовжено наSidebar_Switch
  • User_Profile_Addon-> продовжено на User_Profile_Checkbox(див. питання 3255 )
  • Comment_Form -> продовжено на {$theme_name}_Comment_Form

1
Будь-який шанс отримати свої "теми" заняття? Я хочу написати своє, і я хотів би знати, як ви це робите.
Horttcore

1
Я ще цього не вирішив. Можливо, я буду переглядати нову базову тему разом з @bueltge наступного року, яка використовує деякі з цих занять. Я дуже боюся, не до маршу.
фуксія

5
Спеціально для ваших випадків, безкоштовних тем та рамок, OOP - це шлях. Інші люди повинні працювати з цими кодами. Автори повинні зробити цей процес максимально легким та гнучким. Замінити клас простіше, ніж замінити 20 функцій, оскільки добре написаний клас має чітко визначений API.
фуксія

2
Я не можу нічого сказати про Гібрид; я ніколи його не використовував. Але, так, контролер, який організовує все за шторами, пропонує хороші фільтри та вставляє деякий MVC-зразок у звичайний безлад - це хороша річ. Не вірте мені. Спробуй це. :)
fuxia

3
Настав час, WordPress потребує тему OOP для розробників; Я сподіваюся, що ми знаходимо час, щоб працювати на досягнення своєї мети. Цей невеликий уривок тут і переваги показують великі можливості з oop для клієнтських тем; швидкий спосіб реалізувати нові теми, також відмінно підходить для обслуговування.
буйство

3

Ще один момент, який слід врахувати: швидкість.

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

Після короткого огляду / роздруківки я знайшов ~ 1.700 внутрішніх функцій та ~ 1.400 функцій користувача = ~ 3.100 / 3.200 функцій VS. ~ 250 класів. Я думаю, це говорить найбільше про те, скільки потрібно було б шукати. Якщо ви задіяли !function_exists('')близько 50-100 функцій у своїй темі ... просто встановіть таймер для однієї, а потім починайте займатися математикою. Навіть якщо це не OOP, це хороший спосіб зробити код

1) багаторазове використання
2) ремонтопридатне
3) обмінне
4) трохи швидше

Коли ви подивитеся на різні класи, що плавають у Інтернеті, які допомагають швидко робити метабокси, віджети тощо. деякі рядки в контролері, який обробляє ваші класи.


2

Деякі стверджують, що інкапсуляція - єдина (або принаймні первинна) користь, яку пропонує ООП, і що спадщина і стан є десь між нудним і злим:

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

Автор більше розмовляє про використання класів / об’єктів як конструкцій, ніж як контейнери для статичних функцій, але цікаво читати зовсім інше питання щодо того, хто знаходиться прямо поза табором OOP.

Я можу написати наступний плагін WordPress в Haskell.


1
Блог відкритий лише для "запрошених" користувачів, на жаль. Ще одне нагадування про те, чому ми ніколи не повинні розміщувати нашу інформацію на безкоштовній службі, а натомість розміщувати власні блоги. У цьому плані Facebook майже однаковий. Оновлене посилання на ресурс було б непогано. FWIW Я бачив темну сторону OOP і більше ніколи її не використовуватиму, якщо це абсолютно не потрібно в контексті, оскільки функції вищого порядку зазвичай можуть розширювати функціональність та допомагати зменшити котлет та неправильне використання classключового слова.
Джош Хабдас

2

О, цілком дискусія! Я також повинен визнати, що я використовую заняття для інкапсуляції набагато частіше, ніж ні. Тут ідея про те, що в своїх плагінах я можу перенести свої функції в клас, а в межах цього класу використовувати дуже прості, змістовні назви методів, які є загальними навіть серед інших плагінів, які я пишу. У цьому випадку класи є заміною просторів імен, яких я змушений уникати для середовищ 5.2.x.

Хоча є мало випадків, коли OOP корисний для модульності, простий акт обертання ваших функцій також створює додатковий бонус для розширення крос-плагінів. Наприклад, я нещодавно розширив рішення для виставлення рахунків на основі класу, і будучи таким, я міг розширити основний клас, додати додатковий код до різних функцій (w / parent :: call) або навіть замінити функції, все без інтерналізації розширеного плагіна.

Але все-таки, обгортання класів здебільшого є лише заміною просторів імен.


-4

Який сенс скаржитися на код, який ви не написали?

Якщо код вам не подобається, напишіть свій власний!

Простий. Проблема вирішена.

Програмістам подобається робити речі своїм шляхом. Тож не припускайте, що ви можете сказати їм, як писати код, який віскі пити, яку марку сигарети курити чи яку релігію слід дотримуватися. Вони просто налагодять такий діатриб і продовжуватимуть робити те, що хочуть. ;-)

Код - це не поезія. Код - це варіація пісні синатри "My Way" ...


10
Це питання не скаржиться на код, воно вимагає чіткого пояснення того, чому код буде написаний певним чином. Значна частина основ WP є процедурною, з декількома новими можливостями, що використовують підхід OOP. Багато сучасних плагінів також використовують OOP для інкапсуляції функціональності. Але більшість тем не відповідають. ОП запитувала, чому застосовуватиметься псевдо-OOP-підхід, і наводила Hybrid як приклад. Ти не відповідаєш на запитання, ти обманюєш.
EAMann
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.