• Как избавиться от многочисленных if/else?

    Adamos
    @Adamos
    class CalculationData;
    
    abstract class Calculation 
    {
      public function calculate(CalculationData data);
    }
    
    class CalculationQueue 
    {
      public function addCalculation(Calculation calculationVariant, int priority);
    
      public function calculate(CalculationData data) {     
         for (c in calculations) {
           if(res = c.calculate(data)) return res;
         }
      }
    }
    Ответ написан
    4 комментария
  • Изучать программирование для работы или для универа?

    Zoominger
    @Zoominger
    System Integrator
    Да, стоит.
    Изучение одного языка серьёзно облегчит изучение другого, потому что даёт понятие о базовых, языконезависимых конструкциях.
    Ответ написан
    Комментировать
  • Ревью кода. Что можно улучшить?

    GavriKos
    @GavriKos
    1) Зачем вам вообще массив чисел?
    2) Паузить основной поток - так себе идея, ИМХО
    3) Есть бесконечный цикл без всяких возможностей его прервать.
    4) Куча лишних переносов строк, левые пробелы, нет пробела между параметрами... В общем кодстайл так себе.
    Ответ написан
  • Актуальна ли книга Джеффри Рихтера: CLR via C# Программирование на платформе Microsoft NET Framework 4.5 на языке C#?

    sarapinit
    @sarapinit Куратор тега C#
    Точу водой камень
    Книга Рихтера - хорошая база для понимания работы CLR. Большая часть будет релевантна и для CoreCLR в частности. А к тому времени как вы проработаете 4е издание, может Рихтер и про CoreCLR напишет.
    Ответ написан
    Комментировать
  • Зачем нужно ООП?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Прочитайте "Чистый код" Роберта Мартина, там это доходчиво объясняется. Все существующие парадигмы программирования, паттерны проектирования и архитектурные принципы существуют ровно с одной целью - снизить сложность сопровождения и развития большой кодовой базы.
    Ответ написан
    Комментировать
  • Зачем нужно ООП?

    @EvgeniiR
    https://github.com/EvgeniiR
    Разберитесь с разницей между ООП и процедурным программированием для начала.
    ООП в формулировке "Инкапсуляция, Наследование и Полиморфизм" может и не нужно.
    Объектно-ориентированный дизайн как инструмент декомпозиции нужен чтобы контролировать сложность системы.

    И вообще, вы хотите чтобы вам тут в двух словах разобрали тему многих книг и публикаций. Так не бывает.

    то прелесть этой абстракции теряется - объект слишком сложный, чтобы его представить, непонятно что от чего наследуется где-то в недрах кода, всё по 100 раз переопределяется...

    От того что автор это месиво назвал ООП оно таким не стало. Вы судите по инструменту на примерах его плохого использования.
    И в этом, нужно сказать, есть и здравый смысл. ООП сейчас это термин не имеющий конкретного определения, и его понимание у всех своё. Поэтому стоит смотреть на что-то более конкретное.

    Впрочем, если вам этот ответ что-то даст:
    Цель ООП - управление сложностью ПО.
    Ответ написан
    1 комментарий
  • Что конкретно может дать программисту знание языка Lisp?

    @mithraen
    У каждого языка есть набор подходов к разработке, которыми в нем наиболее удобно пользоваться. Опыт использования языков с разными парадигмами разработки меняет мышление — вы можете сформулировать задачу разными способами.

    Это, в итоге, оказывается полезным и при разработке на других языках.

    С практической же точки зрения сейчас Lisp мало интересен. Насколько я вижу, сейчас на практике используют скорее Scala.

    Вообще функциональные языки очень интересны. Их освоение для более-менее опытного программиста оказывается сложным (новичку их осваивать даже проще), из-за того, что многие привычные подходы в них оказываются неудобны. Но после освоения — оказываются даже проще в разработке чем объектно-ориентированные и процедурные.

    Итоги:
    1. Освоение функциональных языков полезно потому, что повысит скорость и качество разработки и на других языках (правда будет неприятный побочный эффект — от них станет подташнивать, когда окажется что вещь реализуемая в несколько строк на haskell требует несколько страниц бреда на C++).

    2. Их очень удобно использовать в качестве скриптовых языков внутри более сложных продуктов (как тот же AutoLISP).

    3. В крупных «enterprise» проектах их использовать нереально из-за того что мало разработчиков которые с ними знакомы, а для бизнеса заменимость сотрудников критически важна.

    4. В небольших проектах, которые пишутся в одиночку — после освоения они могут дать заметно большую скорость реализации проекта. Соответственно, если заказчику все равно на чем сделано, лишь бы работало и работало хорошо, и оплата попроектная — функциональщик может банально зарабатывать больше.

    5. Некоторые функциональные языки, например Haskell и OCaml обладают очень интересной и мощной системой типов, которая одновременно не так сильно путается под ногами как в Java, но при этом очень жесткая, и срезает множество потенциальных ошибок.

    6. Ну и еще — например в JavaScript и Perl есть ряд инструментов, привычных для функционального программирования. Владение хотя бы одним функциональным языком программирования позволит писать более красивый код на этих языках.
    Ответ написан
    3 комментария
  • Лисп или хаскел?

    Начнём с того, что Лисп не функциональный. Тем, кто приходит в Лисп из мира императивных языков может так казаться, но я пришел в Лисп после Хаскела и я тебе точно говорю, Лисп - не функциональный.
    Теперь по теме - оба языка крайне интересны и способны взорвать мозг, но Хаскел вставляет сильнее, он действительно заумный и изобилует супер-дупер новыми изощренными технологиями программирования (Аппликативные функторы, комбинаторы, монады, ленивые вычисления), но что тебе действительно взорвёт мозг - это чистота языка (нельзя совершать побочные эффекты т.е. не напишешь в консоль где хочешь, не присвоишь значение переменной), отсутствие циклов и декларативность (ты не пишешь "как", а пишешь "что" представляет из себя задача). Но это только в начале. Когда освоишься, оказывается, что Хаскел очень выразителен и краток. Но есть у него и минусы - он очень сложен, ОЧЕНЬ. Серьезно, даже через пол года, у тебя по-прежнему будут проблемы. Уверен, 95% хаскелистов не объяснят в подробности, как работает Hello world на хаскеле, который выглядит так:
    main::IO ()
    main = do
    putStrLn "Hello world!"

    выглядит не сложно, но вот что скрывается под водой: все вычисления происходят в монаде IO т.к. только в ней разрешены побочные эффекты. Побочный эффект (действие ввода-вывода) выполняется только тогда, когда вернётся в main т.к. побочные эффекты разрешены только в main (поэтому и только в монаде IO т.к. main возвращает IO () ). Что такое IO ()? Это как бы список действий, которые туда запихиваются и объединяются в цепочку, чтобы быть последовательными (вне монады порядок выполнения твоих инструкций не определён, счастливого дебага). Эти действия на самом деле не выполняются сразу, а представляют из себя "обещание" сделать это действие, которое реализуется как только что-то уже действующее не затребует результат, в нашем случае это консоль... в общем и это только верхушка айсберга, я еще про типы не говорил, про извлечение и упаковку в монаду, про отображения множеств, карринг и тд.
    В общем хаскел это интересно, но очень сложно. Даже если не пообломаешь зубы, у тебя очень долго будут проблемы с дебагом, с пониманием всяких астральных техник, которые плодятся день и ночь, вроде стрелок или линз. Да и понять чужой код на хаскеле часто очень сложно, потому что каждый считает, что просто обязан применить все заумные штуки, которые он знает, ведь разве не для этого он учил хаскел? А ведь потом люди будут читать это...
    Теперь пара слов о Лиспе - тут у меня меньше опыта, но идея такая - это программируемый язык программирования. Кроме того, что в нём есть макросы - специальные инструменты, чтобы писать программу которая напишет программу, так и сам язык представляет из себя синтаксическое дерево в своём первозданном виде, что открывает безграничные возможности в метапрограммировании. В общем идея такая - этот язык в умелых руках становится абсолютно чем захочешь. Нравится хаскел и ФП? Отлично, сейчас реализуем. Хочешь ленивые вычисления? На! Хочешь классы? Вот! Хочешь логическое программирование? Держи! При всём этом язык крайне прост, может даже проще Си.
    Так, что я тебе посоветую? Наверное, начинай с Хаскела - он тащит за собой огромную теоретическую базу и целый арсенал таких приёмов программирования, которые тебе и не снились. Выучишь, освоишься - подумай о лиспе. Но! Тебе в любом случае нужно будет ставить Emacs - это самая лучшая среда для этих обоих языков, а Emacs конфигурируется на Emacs Lisp, так что у тебя будет возможность на него посмотреть. Посмотри видео по емаксу https://www.youtube.com/playlist?list=PLECBtie1W1t... (там и про Emacs Lisp есть глава), потом качаешь "Хаскел во имя добра" и "О хаскел по-человечески" и читаешь их параллельно - в первой хорошее мягкое введение, а во второй практика - она нужна сразу, чтобы хотябы знать, как создать проект с помощью cabal и собрать его, а то Липовача пол книги в интерпретаторе сидит.
    Ответ написан
    1 комментарий
  • Как вы читаете незнакомый код?

    Martovitskiy
    @Martovitskiy
    Наткнулся недавно на статью.
    Почему программисты ненавидят работать с чужим кодом?

    Вот представь, что тебе доверили достроить за другим прорабом лабораторию на острове. Ты приходишь на объект, а там кроме недостроенного здания: огромный вентилятор (размером со здание), большой воздушный шар и комната набитая швабрами. Почесав голову, ты разбираешь этот хлам и доделываешь лабораторию. Сдаешь объект ученным, но через 5 минут они выбегают с криком: "УТЕЧКА ЯДОВИТОГО ГАЗА!!!".
    — Как так–то, б..ть! Должно же работать! — в отчаянии кричишь ты и звонишь прошлому прорабу:
    — Вася, у нас ядовитый газ потёк! В чем проблема?
    — Не знаю, должно было все работать. Что–то в проекте менял?

    — Немного, швабры вынес...
    — Швабры потолок держали!
    — Что??? Что, б...ть, извините???
    — Говорю, швабры потолок держали. Над ними цистерны с газом были. Очень тяжелые, пришлось в комнату снизу швабры напихать.

    — Ты хотя бы записку на двери повесил бы, что швабры для держания потолка! У нас тут ядовитый газ течет! Что нам делать?
    — Включай вентилятор. Он сдует газ с острова.
    — Я его, б...ть, демонтировал сразу же!
    — Зачем?
    — Зачем ты построил 120 тонный вентилятор? Ты не мог положить ящик бл...ских ПРОТИВОГАЗОВ?
    — Ящик противогазов искать нужно, а вентилятор у меня с прошлого заказа оставался.

    — Вася, я убрал твой вентилятор! Мы тут задыхаемся!
    — Херли вы тогда там делаете? Садитесь на воздушный шар и у..бывайте!
    Ответ написан
    1 комментарий
  • Что должно находиться в инфраструктурном слое в многослойном приложении?

    xEpozZ
    @xEpozZ
    Веб-разработчик
    Всё, что не важно для бизнес-логики, должно быть вне domain-слоя.
    Разве бизнесу важно, как будет выстроен хеш пароля? (Несомненно, зависит от бизнеса, но в 90% случаев нет).
    Спросите об этом доменного эксперта или хотя бы менеджера.
    Они могут даже не знать, что такое "хеш" в принципе.

    А интерфейс лежит в домене, потому что нужно как-то соединить это "неважно" с "нужно".

    Даже если бы была только одна реализация, ее в примере вынесли все равно.

    Можно ли положить в домене? Вы строите систему. Хотите, положите в доменный слой, хотите, вынесите в микросервис. Хотите, пишите на PHP, или на Go или на C++.
    Как решите Вы, так и делайте.

    Правильнее абстрагировать домен от всего лишнего. Всего, что не касается предметной области. Но вот только иногда (почти всегда) этого не удается сделать адекватно и следующий джун обязательно сделает что-то не так.
    Плюс к тому же, абстракциями можно задушиться, что потом не разберешься, что использовать.

    Есть моменты, которые будут меняться вне зависимости от вашей предметной области:
    обновления пакетов, уязвимости в безопасности при использовании чего-либо, новые быстрые реализации каких-либо модулей. В этом случае ваш бизнес-слой не должен быть подвержен изменениям. Но он четко должен знать, если вызовет реализацию этого интерфейса, то получит результат. Лишь это вы и должны гарантировать на бизнес слое.
    Ответ написан
    2 комментария
  • Как вы освоили шаблоны проектирования?

    dmitry_pavlov
    @dmitry_pavlov
    World-class .NET freelance contractor (remotely)
    Когда начался бум и восторг вокруг концепции паттернов проектирования, выкрики "GoF рулит!" и так далее, я озадачился тем, чтобы понять, что за шум?

    По своей сути - паттерны - это обычные шаблоны проектирования. Заимствовано у обычных архитекторов (те, которые зданиями занимаются). Суть проста. В работе архитектора есть задачи, которые удобно решать одним или несколькими проверенными способами.

    По аналогии в проектировании софта имееются свои архитектурные вопросы вроде разбиения приложения на компоненты/модули, организации зависимостей между ними, распределение функциональных обязанностей и т.п. Как ловко подметили авторы книжки из этой банды четырех (The "Gang of Four") в нашей индустрии можно также выделить некоторе количество типовых шаблонов, проверенных на практике, чтобы тем самым не наступать на уже обойденные другими грабли.

    Суть постижения паттернов заключается в том, чтобы осознать в каких ситуациях правильно использовать тот или иной шаблон проектирования и правильно его применить. Важно понимать при этом, что формула "чем больше паттернов я придумал засунуть с свое приложение - тем лучше" - неверная. Использовать их следует с умом и только там, где они действительно нужны. Кроме того, патерны устаревают, превращаются в анти-паттерны по мере развития технологий (которые в нашей области делают это более чем стремительно). Ну и, конечно, есть шаблоны общепринятые и есть те, которые успешно используются в узких кругах.
    Тут тоже надо понимать, что это не догма какая-то - типа 10 священных паттернов проектирования :)

    Чтобы понять, где они нужны - нужен опыт. То есть (я лично убежден), что учиться на ошибках других может только крайне ограниченное число людей. Все остальные обязаны набить шишки самостоятельно :)

    К изучению паттернов я дам такие советы:

    1) Прочтите пару книжек, чтобы понять, что это за зверь и с чем его едят. Можно взять одну из вариаций книжки GoF или какие-то производные для вашего стека разработки - познакомиться с основными популярными шаблонами. Сразу после этого я посоветовал бы прочесть книжку "Горький вкус Java" (Брюс Тейт) - она про анти-паттерны. Это чтобы понять обратную сторону их использования. Мне понравилась и уберегла думаю от многих проблем. То что на примере Java - неважно. Речь идет о шаблонах, так что представителям других стеков (к которым отношусь и я) будет просто понять все равно.

    2) Постарайтесь осознать, доводилось ли вам сталкиваться в работе раньше с чем-то, что является или могло бы легко стать одним из шаблонов. Где получалось применить концепт верно, а где из-за этого только проблемы были.

    3) В новых проектах, держите в голове полученные по шаблонам знания - вдруг пригодятся.

    В конечном итоге, знаете ли вы паттерны, или нет - с опытом приходит понимание того, какая архитектура будет правильная, а какая - нет. Как сделать удобно, а как нет. И неважно, какими паттернами это обозвать.

    Я даже пожалуй посоветовал бы подойти к освоению айтишной архитектурной мудрости с другой стороны - со стороны нефункциональных требований или так называемых "-ilities" - их много. Тут вот описаны 7 штук. А вообще их десятки.

    Среди прочих - такие как maintainability (простая поддержка кода), scalability (масштабируемость), extensibility (расширяемость), availability (устойчивость ) и тп. Если, проектируя свое приложение, вы задумываетесь об этих "илитях" и стараетесь их обеспечить в необходимом проекту объеме, то, как правило, ваше приложение будет иметь отличную архитектуру. При этом шаблоны проектирования в ней появятся лаконично сами собой.

    Поскольку идея использовать шаблоны - это попытка опытных программных инженеров дать десяток готовых рецептов менее опытным, чтобы пока они не научились варить "вкусную кашу", они не варили уж что-то совсем несъедобное. :) Учитесь "готовить", разбирайтесь в -ilites :) и все будет хорошо
    Ответ написан
    6 комментариев
  • Как лучше набираться знаний?

    Никаких чужих макетов, никаких "смотри" видео. На личном опыте могу сказать, что 99.9% "блогеров" в направлении веб-разработки - это некомпетентные люди, которые берут либо западные форматы с их контентом и просто копируют видеоролики с не русского пространства нашего любимого ютуба, причем с ошибками. Есть хорошие ребята, но почти у всех смысл такой "хотите узнать больше, подписывайтесь на вебинар и бла-бла-бла".
    Если Вы планируете заниматься вёрсткой, то желательно понимать и основы работы с макетами, да и самые примитивные идеи дизайна Вам тоже пригодятся. Попробуйте освоить, допустим, Figma. Создайте свой собственный макет и реализуйте его в явь.

    Есть очень хорошие курсы, которые объединяют практику и теорию, причем они бесплатны.
    https://htmlacademy.ru/ например. Таких ресурсов очень много, заработать на знаниях - тренд в 2019.

    От себя могу добавить прекрасное приложение Sololearn, в котором есть вся базовая информация.

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

    По PHP могу посоветовать Котерова. Отличная книга, где всё понятно разъяснено, но зачем сразу с PHP? Начните с базы, благо она сейчас тоже постоянно расширяет свой диапазон.

    А самое главное - ничего не бывает сразу. Я тоже год назад верстая первую работу для галереи использовал таблицу, а до адаптивности мне было как до Лондона пешком от моего Красноярска. Удачи.
    Ответ написан
    Комментировать
  • Как проектировать приложение с нуля?

    zo0m
    @zo0m
    full stack developer
    Начинаю с мокапов экранов на бумажке, чтобы понять, что именно я собираюсь делать.
    Потом делаю прототип, почти без логики, в основном вьюшки с захардкожеными данными.
    Становится понятно, что за сущности мне будут нужны.
    Берусь за MVP, т.е. превращаю прототип в рабочее приложение, т.е разбиваю вьюшки прототипа на компоненты, добавляю модели, слой логики, привожу в порядок структуру приложения.
    Дальше "наращиваю мясо" на MVP, пока не наберётся критическое количество изменений, потом делаю большой рефакторинг, после - "релиз".

    Мне нравится книга «Getting Real» от 37 signals, бесплатная, вроде уже перевели.
    Ответ написан
    3 комментария
  • Почему я должен писать именно так, а не иначе?

    Какой-то глупый вопрос. Такой синтаксис языка.
    Ответ написан
    Комментировать
  • Проектирование структуры приложений для начинающего?

    @EvgeniiR
    https://github.com/EvgeniiR
    Роберт Мартин, "Чистая Архитектура", "Чистый код", "Идеальный программист"
    Макконнелл, "Совершенный код".

    Далее по ситуации, Фаулер, Эванс, Кент Бек и т.п.

    Заменять чтение книг собиранием по крупицам информации в интернете ни в коем случае не советую.
    Ответ написан
    28 комментариев
  • В чем отличие двумерного массива от массива массивов?

    @tikks
    Принципиальное отличие в том, что у массивов внутри массива могут быть разные размерности.
    Если наглядно представить себе массив массивов как таблицу, а внутренние - как строки, то эти строки могут быть разной длины, эта таблица будет как бы ступенчатая. Для двухмерного массива таблица будет прямоугольная, все строки одинаковой длины.

    Обратите внимание на свойство Length:
    Для массива массивов myArray:
    myArray.Lenth - вернет число вложенных массивов,
    myArray[0].Length - размер первого вложенного массива,
    myArray[1].Length - размер второго вложенного массива, который в общем случае не равен myArray[0].Length,
    и т.д.

    Для многомерного массива myArray:
    myArray.Lenth - суммарное вернет число элементов по всем измерениям,
    myArray.Rank - число измерений массива,
    myArray.GetUpperBound(dimension) - размера массива по измерению dimension (от 0 до myArray.Rank-1).

    Доступ к элементам многомерных массивов и массивов массивов тоже осуществляется по-разному. Вот тут можно почитать про особенности доступа к элементам массива:
    Массивы массивов
    Многомерные массивы
    Ответ написан
    1 комментарий
  • Как организовать сложную бизнес-логику?

    Таблица возможных значений.

    Таблица значений ComboBox_1. Всегда доступно все.
    ---------------------------------------------
    ComboBox_1
    CB1_Item_01
    CB1_Item_02
    CB1_Item_03
    ...
    ---------------------------------------------
    
    Таблица значений ComboBox_2. Доступно то что со знаком "+", зависит от выбранного CB1_Item_хх.
    ---------------------------------------------
             -           CB2_Item_01  CB2_Item_02  CB2_Item_03
    CB1_Item_01          +                     +                    +
    CB1_Item_02          -                      +                    +
    CB1_Item_03          -                      +                    +
    ...
    
    Таблица значений ComboBox_3
    ---------------------------------------------
             -                      -          CB3_Item_01  CB3_Item_02  CB3_Item_03
    CB1_Item_01   CB2_Item_01          +                     +                    +
    CB1_Item_01   CB2_Item_02          -                      +                    +
    CB1_Item_01   CB2_Item_03          -                      +                    +
    ...
    CB1_Item_02   CB2_Item_02           -                      +                    +
    CB1_Item_02   CB2_Item_03           -                      +                    +


    В первой таблице доступно все.
    Во второй уже в зависимости от выбранного элемента с первой.
    В третьей умножение первой таблицы на вторую дают все возможные комбинации, на против которых указан доступ к элементам.

    Другими словами работа с множествами.
    1-ое доступно целиком.
    2-ое умножается на первое, и решение указано на пересечении.
    3-е умножается на первое и второе множества, решение указано на пересечении.
    Ответ написан
    3 комментария
  • Как задать очередь событий jQuery?

    andykov
    @andykov
    Shit happens
    $('div').on('click', function(){
    	$(this).addClass('ring');
      setTimeout(function(){
        $(this).removeClass('ring');
      }.bind(this), 200);
    });

    https://jsfiddle.net/o5oL01qn/
    Ответ написан
    Комментировать