Когда я делаю фичи, то пишу код сначала в одном файле и по мере необходимости его разбиваю на части. С tailwind я просто беру кусок JSX--ины, делаю ctrl+x и ctrl+v в новом файле. Всё. С css-модулями такой подход к написанию кода будет более медленным и менее удобным, чем с tailwind
На каждую технологию найдется свой проект, в котором ничего хорошего не было :)
Ну вы там выше писали, что проект был большой, и над ним работало несколько команд параллельно. Я в таких условиях Tailwind не использовал. Вполне допускаю, что при росте команды он будет вставлять палки в колеса. В больших командах использовал только CSS модули. Tailwind использовал в команде из трёх человек максимум.
Но это не отменяет личных предпочтений :) Если мне нужно написать что-то для себя, то я возьму Svelte и Tailwind и напишу фронтенд почти с закрытыми глазами. Но ни Svelte, ни Tailwind не популярны на "рынке труда"
На каждую технологию найдется свой проект, в котором ничего хорошего не было :)
Ну вы там выше писали, что проект был большой, и над ним работало несколько команд параллельно. Я в таких условиях Tailwind не использовал. Вполне допускаю, что при росте команды он будет вставлять палки в колеса. В больших командах использовал только CSS модули. Tailwind использовал в команде из трёх человек максимум.
Но это не отменяет личных предпочтений :) Если мне нужно написать что-то для себя, то я возьму Svelte и Tailwind и напишу фронтенд почти с закрытыми глазами. Но ни Svelte, ни Tailwind не популярны на "рынке труда"
В простынях нет ничего страшного. Самый большой минус простыни лишь в том, что она выглядит некрасиво на слайде для конференции или в листинге кода внутри книжки :)
Я понимаю вас, тоже писал на модулях и SCSS, но они в моём личном рейтинге стоят на втором месте. Всё, что вы написали, справедливо, но лично мне гораздо удобнее и быстрее работать с Tailwind.
Это удобство сложно объяснить, это что-то на уровне того, как вы (и я в личных беседах) пытаетесь объяснить удобство Mobx людям, которые его никогда не пробовали. У них всегда в запасе есть какие-то теоретические возражения, которые на практике при работе с Mobx даже и не встречаются. С Tailwind, на мой вкус, такая же история.
Честно говоря, когда впервые увидел что вам Tailwind не нравится, то сильно удивился, потому что по всем остальным глобальным вопросам во фронтенде мы, кажется, сходимся :)
Такие длинные классы только выглядят непривычно, но на практике работу ускоряют очень прилично (ссылок на пабмед не будет, это личный опыт). Если одинаковую вёрстку нужно использовать в нескольких местах, её можно обернуть в компонент, но вы это и так понимаете, просто вредничаете:
Для меня лично самый большой плюс Tailwind'а -- это отсутствие головной боли от придумывания бесконечного количества имён для классов. Пусть лучше будет bg-green-100 text-green-900 text-sm, чем name-wrapper, user-wrapper-container и прочие абсолютно искусственные наименования, которые никак не помогаю понимать и быстро менять код
На уроках русского языка в белорусских школах пишут "белорусский". А на уроках беларускай мовы пишут "беларускі". "Беларуский" -- это уже трасянка, которую почему-то любят в интернетах.
Это не моя трактовка, это трактовка российского издания 2016 года выпуска. Вырван ли это текст из контекста? Да! Поэтому в цитате стоит многоточие в квадратных скобках и написана страница, где текст можно почитать целиком.
Дал ли я свою трактовку прочитанному? Да! Всё люди пропускают потребляемую информацию через собственный фильтр. Но если посмотреть на то, насколько сильно российское айти-сообщество тащиться от этой книги, такую трактовку дал не только я.
А в чём здесь идея? В длинных нечитаемых названиях методов, скрытых сайд-эффектах и неявном дата-флоу? Код для бизнеса от такого лучше не станет.
Если что, в книге есть не только такой алгоритмический пример. Всю третью главу Мартин ссылается на листинг 3.7. Это реальный код из библиотеки для тестирования Fitnesse. В нём чуть больше ста строк кода, поэтому уберу под спойлер, но его обязательно стоит почитать.
Тут ровно такой же паттерн, как и в алгоритмическом примере: неявный дата-флоу и скрытые мутации. Есть только один плюс -- тут не такие длинные названия методов.
По поводу скрытых мутаций. Можно подумать, что Мартин не рассматривает изменение переменных своего класса как мутацию. Но вот цитата прямо из этой же третьей главы (страница 69).
Побочные эффекты суть ложь. Ваша функция обещает делать что-то одно, но делает что-то другое, скрытое от пользователя. Иногда она вносит неожиданные изменения в переменные своего класса -- скажем, присваивает им значения параметров, переданных функции, или глобальных переменных системы. В любом случае такая функция является коварной и вредоносной ложью, которая часто приводит к созданию противоестественных временных привязок и других зависимостей.
Я согласен с цитатой на все сто процентов. Но что мы видим в коде, который Мартин считает чистым, правильным и достойным находиться в его книге? Метод render принимает объект pageData и делает скрытую мутацию этого объекта в методе updatePageContent. Я бы никогда в жизни не ожидал, что передав pageData в статический метода SetupTeardownIncluder.render я получу мутацию. Почему рендер вносит какие-то изменения в контент страницы? Где здесь пресловутый принцип единственной ответственности?
У меня очень много вопросов к этому реальному коду! Зачем он сохраняет переменную isSuite на уровне инстанса класса? Если явно прокинуть её в методы, то код получится более... явный и простой в чтении. Почему он не использует собственный принцип "Один уровень абстракции на функцию" из этой же главы (страница 61), а вместо этого в метод render пихает сборную солянку: установку значения для переменной, два вызова приватных методов, возврат результата выполнения pageData.getHtml()? Я не джавист, но решил немного отрефакторить этот код. После рефакторинга сразу видно, что класс просто утилитарный, которому не нужно никакое внутреннее состояние, а мутация пусть и осталась (её здесь никак не убрать), но зато находится на самом видном месте. При желании весь этот код можно просто поместить внутрь класса PageData.
Воспользуюсь фишечкой Роберта Мартина и изложу своё мнение о своём же рефакторинге в виде беспрекословных истин и не буду извиняться за свою категоричность. Код получился гораздо более явный и простой для понимания. В этот код легче и быстрее внести изменения, если этого потребует бизнес. Каждая функция внутри класса имеет явный инпут и аутпут и понятный дата-флоу, поэтому об этих функциях проще размышлять и их легко тестировать. Такой код достоин называться профессиональным.
Можно немножко навалить контекста. Изначально это был длиннющий код Кнута, который автор и решил "оптимизировать".
Длиннющий код — это не совсем то, что написал Кнут. Такой код получается, если конвертировать Кнутовский WEB в обычный код. Улучшать его — это что-то вроде рефакторинга JS файлов, скомпилированных из тайпскриптовых сорсов. Можно, но зачем?
Сам код написан в концепции Literate Programming и разбит на аккуратные составные части. Кнут тоже отделяет генерирование простых чисел от записи этих чисел в файл, и не сваливает весь код в одну кучу.
То есть, Мартин действительно рефакторит портянку. Но он сам получил эту портянку довольно странным образом и на нескольких страницах героически сражается с ней.
Сам Мартин в первой главе на страница 35 пишет вот так:
Мы излагаем свои мнения в виде беспрекословных истин и не извиняемся за свою категоричность. Для нас, на данном моменте наших карьер, они являются беспрекословными истинами. Они составляют нашу школу мысли в области чистого кода. [...] Мы утверждаем, что если вы последуете нашему учению, то это принесёт вам такую же пользу, как и нам, и вы научитесь писать чистый и профессиональный код.
Ни одна из этих разных школ не обладает абсолютной истиной. Тем не менее в рамках конкретной школы мы действуем так, будто её учение и арсенал приёмов верны. [...] Считайте, что эта книга является описанием Школы учителей Чистого кода. [...] Мы утверждаем, что если вы последуете нашему учению, то это принесет вам такую же пользу, как и нам, и вы научитесь писать чистый и профессиональный код. Но не стоит думать, что наше учение "истинно" в каком-то абсолютном смысле. Существуют другие школы и мастера [...].
Так он тут пишет, что никто не обладает абсолютной истиной. Но следование "Школе учителей Чистого кода" обязательно принесёт пользу и научит писать профессиональный код. Лично я читал эту книгу, чтобы сделать свой код "профессиональным", поэтому эти два абзаца забайтили меня не на поиск "других школ", а на следование учению "Школы учителей Чистого кода".
Если бы у книги цель была не в погружении в своё "учение", то альтернативные "школы" хотя бы были приведены списком. Я нашёл этот отрывок (Глава 1, страница 35). Ни до, ни после нет никаких примеров других "школ". Но зато есть несколько восхитительных цитат в начале страницы:
Мы излагаем свои мнения в виде беспрекословных истин и не извиняемся за свою категоричность. Для нас, на данном моменте наших карьер, они являются беспрекословными истинами. Они составляют нашу школу мысли в области чистого кода. [...] Они [ученики школы] посвящают себя изучению того, чему учит конкретный мастер, часто отказываясь от учений других мастеров.
Короче, для меня вся эта страница -- очень мощная агитка, которая призывает следовать "учению" Роберта во имя написания профессионального кода. Смотря на то, как глубоко эта книга сидит в головах многих программистов, агитка сработала на "отлично".
Потому что книгу 2008 до сих пор рекомендуют к прочтению, спрашивают про чистый код на собесах и срутся по поводу чистоты на код-реаью. Когда новая книга завирусится так же сильно, можно будет и её прочитать и покритиковать.
Тут всё как в обычном CSS. Более подробный CSS-path имеет более высокий приоритет. xl здесь ретебьет md, потому что завязан на data-атрибут
Когда я делаю фичи, то пишу код сначала в одном файле и по мере необходимости его разбиваю на части. С tailwind я просто беру кусок JSX--ины, делаю ctrl+x и ctrl+v в новом файле. Всё. С css-модулями такой подход к написанию кода будет более медленным и менее удобным, чем с tailwind
Наверное, это был проект, написанный по FSD :)
Но рыба в Финляндии действительно вкуснее, и её много. В Питере хрен найдешь не сухую красную рыбу горячего копчения. И это очень грустно!
На каждую технологию найдется свой проект, в котором ничего хорошего не было :)
Ну вы там выше писали, что проект был большой, и над ним работало несколько команд параллельно. Я в таких условиях Tailwind не использовал. Вполне допускаю, что при росте команды он будет вставлять палки в колеса. В больших командах использовал только CSS модули. Tailwind использовал в команде из трёх человек максимум.
Но это не отменяет личных предпочтений :) Если мне нужно написать что-то для себя, то я возьму Svelte и Tailwind и напишу фронтенд почти с закрытыми глазами. Но ни Svelte, ни Tailwind не популярны на "рынке труда"
На каждую технологию найдется свой проект, в котором ничего хорошего не было :)
Ну вы там выше писали, что проект был большой, и над ним работало несколько команд параллельно. Я в таких условиях Tailwind не использовал. Вполне допускаю, что при росте команды он будет вставлять палки в колеса. В больших командах использовал только CSS модули. Tailwind использовал в команде из трёх человек максимум.
Но это не отменяет личных предпочтений :) Если мне нужно написать что-то для себя, то я возьму Svelte и Tailwind и напишу фронтенд почти с закрытыми глазами. Но ни Svelte, ни Tailwind не популярны на "рынке труда"
В простынях нет ничего страшного. Самый большой минус простыни лишь в том, что она выглядит некрасиво на слайде для конференции или в листинге кода внутри книжки :)
Я понимаю вас, тоже писал на модулях и SCSS, но они в моём личном рейтинге стоят на втором месте. Всё, что вы написали, справедливо, но лично мне гораздо удобнее и быстрее работать с Tailwind.
Это удобство сложно объяснить, это что-то на уровне того, как вы (и я в личных беседах) пытаетесь объяснить удобство Mobx людям, которые его никогда не пробовали. У них всегда в запасе есть какие-то теоретические возражения, которые на практике при работе с Mobx даже и не встречаются. С Tailwind, на мой вкус, такая же история.
Честно говоря, когда впервые увидел что вам Tailwind не нравится, то сильно удивился, потому что по всем остальным глобальным вопросам во фронтенде мы, кажется, сходимся :)
Такие длинные классы только выглядят непривычно, но на практике работу ускоряют очень прилично (ссылок на пабмед не будет, это личный опыт). Если одинаковую вёрстку нужно использовать в нескольких местах, её можно обернуть в компонент, но вы это и так понимаете, просто вредничаете:
Для меня лично самый большой плюс Tailwind'а -- это отсутствие головной боли от придумывания бесконечного количества имён для классов. Пусть лучше будет
bg-green-100 text-green-900 text-sm
, чемname-wrapper
,user-wrapper-container
и прочие абсолютно искусственные наименования, которые никак не помогаю понимать и быстро менять кодНа уроках русского языка в белорусских школах пишут "белорусский". А на уроках беларускай мовы пишут "беларускі". "Беларуский" -- это уже трасянка, которую почему-то любят в интернетах.
Вся книга на таких примерах строится. Ещё один пример, который "ближе к жизни и не алгоритмический" в комменте разобрал: https://habr.com/ru/articles/875426/comments/#comment_27818290
Это не моя трактовка, это трактовка российского издания 2016 года выпуска. Вырван ли это текст из контекста? Да! Поэтому в цитате стоит многоточие в квадратных скобках и написана страница, где текст можно почитать целиком.
Дал ли я свою трактовку прочитанному? Да! Всё люди пропускают потребляемую информацию через собственный фильтр. Но если посмотреть на то, насколько сильно российское айти-сообщество тащиться от этой книги, такую трактовку дал не только я.
В книге есть примеры и реального кода. В другой ветке его прокомментировал: https://habr.com/ru/articles/875426/comments/#comment_27818290
А в чём здесь идея? В длинных нечитаемых названиях методов, скрытых сайд-эффектах и неявном дата-флоу? Код для бизнеса от такого лучше не станет.
Если что, в книге есть не только такой алгоритмический пример. Всю третью главу Мартин ссылается на листинг 3.7. Это реальный код из библиотеки для тестирования Fitnesse. В нём чуть больше ста строк кода, поэтому уберу под спойлер, но его обязательно стоит почитать.
Пример реального чистого кода
Тут ровно такой же паттерн, как и в алгоритмическом примере: неявный дата-флоу и скрытые мутации. Есть только один плюс -- тут не такие длинные названия методов.
По поводу скрытых мутаций. Можно подумать, что Мартин не рассматривает изменение переменных своего класса как мутацию. Но вот цитата прямо из этой же третьей главы (страница 69).
Я согласен с цитатой на все сто процентов. Но что мы видим в коде, который Мартин считает чистым, правильным и достойным находиться в его книге? Метод
render
принимает объектpageData
и делает скрытую мутацию этого объекта в методеupdatePageContent
. Я бы никогда в жизни не ожидал, что передавpageData
в статический методаSetupTeardownIncluder.render
я получу мутацию. Почему рендер вносит какие-то изменения в контент страницы? Где здесь пресловутый принцип единственной ответственности?У меня очень много вопросов к этому реальному коду! Зачем он сохраняет переменную
isSuite
на уровне инстанса класса? Если явно прокинуть её в методы, то код получится более... явный и простой в чтении. Почему он не использует собственный принцип "Один уровень абстракции на функцию" из этой же главы (страница 61), а вместо этого в методrender
пихает сборную солянку: установку значения для переменной, два вызова приватных методов, возврат результата выполненияpageData.getHtml()
? Я не джавист, но решил немного отрефакторить этот код. После рефакторинга сразу видно, что класс просто утилитарный, которому не нужно никакое внутреннее состояние, а мутация пусть и осталась (её здесь никак не убрать), но зато находится на самом видном месте. При желании весь этот код можно просто поместить внутрь классаPageData
.Воспользуюсь фишечкой Роберта Мартина и изложу своё мнение о своём же рефакторинге в виде беспрекословных истин и не буду извиняться за свою категоричность. Код получился гораздо более явный и простой для понимания. В этот код легче и быстрее внести изменения, если этого потребует бизнес. Каждая функция внутри класса имеет явный инпут и аутпут и понятный дата-флоу, поэтому об этих функциях проще размышлять и их легко тестировать. Такой код достоин называться профессиональным.
Длиннющий код — это не совсем то, что написал Кнут. Такой код получается, если конвертировать Кнутовский WEB в обычный код. Улучшать его — это что-то вроде рефакторинга JS файлов, скомпилированных из тайпскриптовых сорсов. Можно, но зачем?
Сам код написан в концепции Literate Programming и разбит на аккуратные составные части. Кнут тоже отделяет генерирование простых чисел от записи этих чисел в файл, и не сваливает весь код в одну кучу.
То есть, Мартин действительно рефакторит портянку. Но он сам получил эту портянку довольно странным образом и на нескольких страницах героически сражается с ней.
Сам Мартин в первой главе на страница 35 пишет вот так:
Довольно близко к библии, заповедям и догмам.
Можно провести эксперимент и написать эти длинные названия по-русски
Так он тут пишет, что никто не обладает абсолютной истиной. Но следование "Школе учителей Чистого кода" обязательно принесёт пользу и научит писать профессиональный код. Лично я читал эту книгу, чтобы сделать свой код "профессиональным", поэтому эти два абзаца забайтили меня не на поиск "других школ", а на следование учению "Школы учителей Чистого кода".
Если бы у книги цель была не в погружении в своё "учение", то альтернативные "школы" хотя бы были приведены списком. Я нашёл этот отрывок (Глава 1, страница 35). Ни до, ни после нет никаких примеров других "школ". Но зато есть несколько восхитительных цитат в начале страницы:
Короче, для меня вся эта страница -- очень мощная агитка, которая призывает следовать "учению" Роберта во имя написания профессионального кода. Смотря на то, как глубоко эта книга сидит в головах многих программистов, агитка сработала на "отлично".
Потому что книгу 2008 до сих пор рекомендуют к прочтению, спрашивают про чистый код на собесах и срутся по поводу чистоты на код-реаью. Когда новая книга завирусится так же сильно, можно будет и её прочитать и покритиковать.