Чому велика кількість магічних чисел прийнятна у CSS та SVG?


63

Часто я бачу такі запитання у списку гарячих запитань до мережі, як цей, які в основному задають питання "як я малюю цю довільну форму в CSS". Незмінно відповідь - це пара блоків даних CSS або SVG з купою, здавалося б, випадкових твердо кодованих значень, які утворюють потрібну форму.

Коли я дивлюся на це, я думаю: «Юк! Який бридкий блок коду. Я сподіваюся, що я ніколи не бачу такого типу матеріалів у своєму проекті ». Однак я бачу такі типи питань і відповідей досить часто і з великою кількістю відгуків, тому явно громада не вважає їх поганими.

Але чому це прийнятно? З мого заднього досвіду це не має для мене сенсу. Так чому це нормально для CSS / SVG?


38
Що таке малюнок, якщо не випадкова купа магічних чисел (придумайте штрихи між 2 (x, y) точками або масивами пікселів тощо), які можуть виглядати красиво?

68
Чи має CSS змінні? SVG?
Oded

36
Ось чому багато великих проектів мають препроцесор CSS на зразок SASS або LESS, який підтримує змінні.
Іксрек

2
@Oded Для CSS існує приблизно 40% глобальної підтримки змінних (тому не рекомендується, якщо ви не хочете сказати всім своїм відвідувачам Microsoft, що вони не бажані). Microsoft, ймовірно, буде слідувати тенденції Edge, і мобільні пристрої з часом наздоженуть. SVG, з іншого боку, має поняття змінних у деякому відмовленому проекті документа про статус, але вони, ймовірно, ніколи не будуть реалізовані.
фірфокс

12
Чому? Тому що це не чарівні числа. CSS зберігає дані, на відміну від програми, яка містить інструкції. Хоча CSS, мабуть, є завершеним, це не мова програмування.
Дерек 朕 會 功夫

Відповіді:


118

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

По-друге, значення можуть бути не такими магічними в мові, специфічній для домену, як CSS. У програмуванні магічне число - це число, де значення чи наміри не очевидні. Якщо рядок говорить:

x += 23;

Ви запитаєте "чому 23"? Яке міркування? Змінна може уточнити наміри:

x += defaultHttpTimeoutSeconds;

Це тому, що самотнє число може означати абсолютно все, що стосується коду загального призначення. Але врахуйте CSS:

background-color: #ffffff;
font-size: 16px;

Висота і колір не є магічними, оскільки значення цілком зрозуміло з контексту. А причина вибору специфічної цінності проста, оскільки дизайнери думали, що це буде добре виглядати. Введення змінної нічого не допоможе, оскільки ви все одно просто назвете її на зразок " defaultBackgroundColor" і " defaultFontSize".


16
Деякі цінності справді вибираються просто тому, що "вони добре виглядають". Але приклад, пов'язаний з ОП, містить кілька разів одне і те ж значення, але незрозуміло, чи вони являють собою одне і те ж або мають однакове значення за збігом обставин. Крім того, він використовує значення, 198pxяке відрізняється розміром чогось іншого ( 200px) і 2pxмежею.
CodesInChaos

1
@CodesInChaos: Так, бувають випадки, коли змінні чи якісь вирази залежності були б крутими.
ЖакБ

21
Зверніть увагу , що CSS робить змінну підтримку
phihag

28
@phihag У специфікаціях, так, але в дикій природі не так вже й багато (я не вважаю 40% глобальної підтримки на час цього коментаря як "широко підтримуваної". Однак ви маєте рацію, сказавши, що в У майбутньому у нас будуть змінні CSS. І я сьогодні дізнався щось нове, тож спасибі за це
phyrfox

2
@JaredSmith Це добре для досить масштабного веб-сайту, однак для звичайних (можливо, статичних) сторінок, включаючи величезну полізаповнення, є надмірним.
Дерек 朕 會 功夫

81

Це прийнятно, оскільки ці формати - це не код , а дані . Якби ви видалили всі "магічні цифри", ви б по суті дублювали кожну мітку, і в кінцевому підсумку виходили б смішні файли типу:

mainkite_width = 200px
...
.mainkite {
  width: mainkite_width;
  ...

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


22
+1, оскільки: "Це прийнятно, оскільки ці формати - це не код, а дані".
Пітер Б

1
"Звичайно, є ситуації, коли непогано уникати дублювання, наприклад, якщо у вас є колір, який часто повторюється, і ви можете змінити, щоб змінити теми." - Мабуть, краще все-таки робити з класами: .main_color { color: .. }а використання цього класу - метод дедуплікації
Ізката

Код, який визначає зовнішній вигляд програми, все ще є кодом, а не даними.
ESR

26

Заборона магічних чисел є первісною версією цього принципу дизайну:

Приймайте рішення в одному місці .

Але це не магічні числа . Принаймні, це стосується не будь-якого відомого про мене стилю кодування.

ширина: 200px;
висота: 200px;

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

Тепер, якщо у вас є 5 об'єктів, які всі повинні були мати однакову ширину і кожен незалежно твердо кодував їх ширину, я бив вас непрямою палицею.

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


4
Якщо у вас було достатньо об'єктів, які потребували змінної, у вас є достатньо об'єктів для створення нового класу.
Jaketr00

1
Це найкраща відповідь, оскільки це свідчить про те, що це не магічні числа.
TheBlastOne

2
"5 предметів, які всі повинні були мати однакову ширину, і кожен незалежно твердо кодував їх ширину, я бив вас палицею". Ласкаво просимо у світ веселого веб-дизайну.
whatsisname

2
Магічні числа не лише проблематичні через "Приймати рішення в одному місці" (він же DRY), а й тому, що їх важко зрозуміти.
sleske

Чи є альтернатива бити палицею?
djechlin

11

Оскільки CSS не є мовою програмування, натомість файл конфігурації містить змінні дані для вашої програми.

В даний час CSS настільки потужний, що ви можете насправді запрограмувати в ньому, але це крім суті. По суті це все ще мова таблиці стилів .

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

Спочатку ми вводимо в наш код тонни магічних чисел. Ширина поля, висота тексту, відступи тощо тощо.

jump(100) // The margin
drawTable(500, 500)
writeText("Hello World", 12)

Отже, ми витягуємо магічні числа і ставимо їх поверх нашого файлу.

int margin = 100
int table = 500
int text_size = 12
jump(margin) // The margin
drawTable(table, table)
writeText("Hello World", text_size)

Зараз це трохи некрасиво. Ми швидше читаємо наші змінні номери з файлу конфігурації.

margin 100
table 500
text size 12

Гм, це трохи незрозуміло ... Що означають ці цифри? Що означають ці імена? Давайте трохи її формалізуємо.

margin_left 10em
table_width 500px
table_height 500px
font_size 12px

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


Ви відчуваєте, куди це йде, врешті-решт потрапляєте як CSS. (І браузер, щоб надати його.)

Чи повинні ми тоді додавати можливості до нашого конфігураційного файла, щоб ми могли знову уникати магічних чисел? Додати змінні? Додати файл конфігурації для нашого CSS-файлу? Здається трохи безглуздо, якщо ви пам’ятаєте, що наш CSS-файл - це той самий файл конфігурації.

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

Однак сучасний CSS дозволяє багатьом способам уникнути цього повторення. Ви можете використовувати класи, які застосовуються до багатьох елементів, ви можете встановити стиль для всіх divs, але потім конкретно замінити один, а CSS 3 навіть дозволяє використовувати певне використання змінних.

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

Зрештою, ви також не хочете занадто багато магічних чисел у своєму конфігураційному файлі :-)


Чому важливо, де знаходиться надмірність? Невже технічне обслуговування не буде проблемою, де б воно не було?
Пітер Мортенсен

@PeterMortensen Це завжди врахування між низьким часом розробки або високою ремонтопридатністю. Висока надмірність легко розробити, тому що ви можете швидко змінити тут і там речі, низька надлишок простота в обслуговуванні, оскільки ви можете швидко змінити глобальний стиль. На практиці ви хочете опинитися десь між двома, адже зіткнутися з цим, мати глобальний стиль значно спрощує навіть додавання нових сторінок, але, маючи кожну останню незрозумілу особливість, дотримуйтесь будь-якої можливої ​​глобальної зміни стилю, вона повинна назавжди розвиватися.
Дорус

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

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

5

Чому для CSS / SVG це [купа начебто випадкових твердо кодованих значень]?

Це не нормально. Це можна писати і підтримувати прості файли «.css», але в кінцевому підсумку випадкові жорстко закодовані значення стануть поширеним тягарем.

Для будь-якого іншого, крім надзвичайно простих веб-сторінок, вам доведеться або розробити дисципліновану стратегію «знайти і замінити», або скористатися препроцесором CSS зі змінними, або визначити стилі за допомогою JavaScript.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.