Pull to refresh
25
Голованов Владимир@Colwin

Senior Java Developer

7
Subscribers
Send message
Принцип KISS гласит: делай настолько просто, чтобы проще было некуда.
Вопрос в том, что такое «проще». Вместо классов использовать дополнительные поля и ветвить логику? Или, наоборот, использовать полиморфизм? Однозначного ответа тут нет.
Зато есть хороший принцип третьего дублирования: если что-то хочешь продублировать в третий раз — пора с условий перейти на полиморфизм.
А заранее создавать абстрактные фабрики, отвязывание по интерфейсам и инъекции — это, естественно, усложнение, а не упрощение. А главная причина создания ООП как раз была в упрощении.
Так что, люди, используем исконные принципы ООП, а паттерны, архитектуры и т.д. — только если они упрощают жизнь.

P.S. IMHO, оба приведенных в статье примера сложны. Первый — чрезмерной абстрактностью и гибкостью, второй — слишком большим количеством условий и логики на нетипизированных данных, собранным в одном месте. Истина где-то между.
Создание сайта и создание приложения это разные вещи


Создание сайта и десктопного приложения Вы имели в виду?
Если что, то сайт — это тоже приложение. Браузерное.
Тихо шифером шурша,
Крыша едет неспеша… (с)
Перечитал свой комментарий, слово «единственное» тут лишнее ).
Не обязательно из среди программистов.
Чтобы понимать принципы и взаимосвязи, необязательно быть разработчиком.
Единственное требующееся умение — понимание программистов.
Менеджер должен учитывать особенности каждого разработчика команды, в том числе касающиеся оценки, и приводить их к общим показателям (суммирующим, средним и т.д.).
Это не отменяет того, чтобы самому для себя развиваться и в качестве грамотного оценщика. Более того, если хочешь из программиста стать архитектором, тебе это необходимо как воздух.
Символично ) фраза, намекающая сама на себя :-)
Не стоит держать компилятор за дурака.
Он умнее нас вместе взятых.
Его несколько лет писали очень умные люди.
И тщательно проводили оптимизации генерируемого кода.
Советую профилировать или смотреть сгенерированный байт-код, прежде чем делать предположения о производительности.
На самом деле, я думаю, много кому будет интересно и полезно вспомнить, что находится под капотом :-)
В нашем деле про это лучше не забывать, потому что там есть ответы на все вопросы, на которые уровнем выше ответа может и не найтись.
Кстати, это одна из причин, почему нельзя сделать так:

    public class SuperClass<T> {
        public void setT(T obj) {
           //...
        }
    }
    
    public class SubClass<Number> extends SuperClass<Number> {
        // Здесь будет ошибка компиляции, т.к. метод с такой сигнатуров уже есть
        public void setT(Object obj) {
            //...
        }

        public void setT(Number obj) {
            //...
        }
    }
Потому что generic'и требуют объекта в качестве параметра.
А упирается это в генерацию кода, совместимого с Java 1.4.
Реально в runtime вместо типа T подставляется ближайший тип, прописанный в extends, и используются приведения типов. Они, естественно, будут безопасными, т.к. компилятор уже все проверил.
IMHO, решать проблему надо в корне.
generic'и нужно заменить на template'ы с поддержкой примитивных типов.
А если следовать парадигме обратной совместимости, то добавить рядом.
Синтаксис различимый вполне можно сделать.
Преобразование между ними — тоже.
Зато приседаний станет гораздо меньше.
Плюс планировщики потоков.
Без этого комментария мысль была неполной.
Для решения проблемы выделенных нитей придуманы пулы потоков :-)
От изменяемого состояния легко избавляться на легковесных объектах.
На тяжелых, конструируемых объектах это бывает необоснованно.
Легко сказать, да не каждый с лету осилит :-)
Да и времени всегда не хватает на исследования, увы.
Кстати, поскольку проблемы с многопоточностью идут от разделяемых данных, часто используют концепцию очередей, когда данные одного потока «привязываются» к событию в очереди, и потом поток-получатель события получается эти данные.
Существует множество хороших решений для реализации очередей, так что можно просто использовать готовое решение, вся сложность многопоточных блокировок спрячется под капот, и останется только следовать event-oriented парадигме.
Любое изменение кода со сложным управлением многопоточностью должно проводиться под микроскопом.
Желательно с формальным доказательством а-ля happens-before.
В стандартных UI-компонентах Delphi очень плохо с инкапсуляцией.
Вплоть до того, что можно штатным, нормальным использованием интерфейса класса получить Exception. (!)
IMHO, в C# и Java с этим гораздо лучше.
Думаю, наиболее правильно было бы иметь возможность устанавливать браузерам права доступа на уровне ОС.

Information

Rating
Does not participate
Location
Новосибирск, Новосибирская обл., Россия
Date of birth
Registered
Activity