Ответы пользователя по тегу Проектирование программного обеспечения
  • Все говнокодеры?

    @cicatrix
    было бы большой ошибкой думать
    Благими намерениями мостится дорога в ... говнокод.
    Вот здесь надо быстро, лень смотреть, зафигачу прямой запрос.
    Вот в этом классе сделаю это поле public. Тест провалился, хорошо, добавлю отдельный if для этого случая. А вот здесь какая-то хрень написана, ладно, напишу ещё один метод, делающий то же самое, но по-моему. Ой, а в этой либе фича новая. А вот тут жалуются, что медленно, пох, закэшируем данные... В общем, даже хорошо задуманный проект со временем обрастает вот этим вот всем. Ни разу не видел, чтобы было по-другому (видел, кривую архитектуру изначально, ещё видел полное отсутствие архитектуры как таковой).
    Ответ написан
    Комментировать
  • Стоит ли размещать private метод сразу после public метода при условии того этот метод реализует часть логики public метода?

    @cicatrix
    было бы большой ошибкой думать
    Есть хорошая цитата:
    Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живёте


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

    Ваш код должен быть лёгким для сопровождения. Остальное - вкусовщина.
    Ответ написан
    Комментировать
  • Как накидать логику работы будущей программы?

    @cicatrix
    было бы большой ошибкой думать
    Начинается всё на листке бумаги. Если проектируешь один, то никаких формальных схем описания придерживаться не нужно. Просто так, чтобы самому было понятно, что и как.

    Подхода два - от интерфейса к логике или наоборот - от логики к интерфейсу. Что лучше, что хуже - вкусовщина. От интерфейса к логике получается немного более по "KISS-овски" и "YAGNI-вски", так как накидываешь только те фичи, которые хочешь реализовать. От логики к интерфейсу работать тоже можно, но тут есть риск уйти в преждевременную оптимизацию.

    Дальше логика разбивается на блоки задач и модели данных. К моделям определяешь, какие действия с ними надо будет совершать - так определяются методы. Здесь же определяешь сигнатуры этих методов (параметры, их типы, возвращаемые значения). Если проект крупный - то тут уже неплохо было бы UML схемку набросать.

    После того, как определил иерархию классов, можно уже запускать IDE и сразу создать определения всех классов которые ты нарисовал на бумаге. В каждом классе рисуешь заглушки методов (можно сразу помечать комментарием TODO, чтобы ничего не опустить).

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

    Ну вот уже после всего этого, начинай писать код. Тебе будет легко и приятно. Ты будешь примерно представлять, сколько ты уже сделал, и сколько ещё осталось. Баги будут вылавливаться тестами, и ты не будешь писать лишний код, которым никто не будет пользоваться в дальнейшем.
    Ответ написан
    1 комментарий
  • Почему важно "Разделение ответственности"?

    @cicatrix
    было бы большой ошибкой думать
    Абстрактно если, псевдокодом
    password = Window.TextBoxPassword.Value
    if (!password.RegexMatch('^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$ %^&*-]).{8,}$"))
         Window.ValidationText.Text = "Пароль слишком слабый";
    else
         try
             connection = new Connection("connecttion string to database");
             .RunSQL("update users set password = @password where username = @user"
         catch  
             Window.ResultMessage.Text = "Ошибка"
    Window.ResultMessage.Text = "Пароль изменён"


    И таких кусков в программе, например 3, где меняется павроль, но ты знаешь только про 2, так как третий добавили без тебя.
    Вопросы: что будет, если изменятся требования к паролю?
    Что будет, если изменится оконный дизайн или вообще UI фреймворк?
    Что будет, если изменится движок бд, названия таблиц?

    сравни c:
    password = GetUserInput();
    if (ValidatePassword())
    {
        UpdateUserPassword()
    }
    Ответ написан
    1 комментарий
  • Почему трёхуровневая архитектура клиент-серверного приложения надёжней двухуровневой?

    @cicatrix
    было бы большой ошибкой думать
    Я знаю быстрые, эффективные, супернадёжные, убиваемые только в случае атомной бомбардировки, приложения, построенные вообще на одном уровне без шаблонов, гайдов, паттернов и юнит-тестов, и видел программы, где всё по фен-шую, но остающиеся глюкающим г-ном.

    Проблема, видимо, не в архитектуре, а в головах разработчиков.
    Ответ написан
    Комментировать
  • Хранение номеров мобильных телефонов и кредитных карт в открытом виде?

    @cicatrix
    было бы большой ошибкой думать
    Если "максимально безопасно" то, разумеется, шифровать.
    Для поиска можно тупо повторить в соседнем поле в незашифрованном виде 4 цифры, которые получаете от банка.
    И да, если "максимально безопасно", то каждая запись должна шифроваться своим ключом, который, разумеется, не должен лежать рядом с записью.

    Вообще, это всё словоблудие: 100%-й безопасности не бывает. Определите сценарий угрозы - от чего именно вы хотите защититься, определите наиболее вероятные векторы атаки на ваши данные, постарайтесь закрыть хотя бы их. Безопасность - это КОМПЛЕКС мероприятий (начиная с того, насколько вы уверены в надёжности своих менеджеров/админов, что они не сольют базу злоумышленнику). Подкуп иногда бывает дешевле взлома.
    Ответ написан
    Комментировать
  • Как распределять потоки при асинхронном программировании?

    @cicatrix
    было бы большой ошибкой думать
    То, что вы описываете, весьма подходит под классический producer/consumer pattern (производитель/потребитель) Почему-то находится мало источников на русском языке, но англоязычных - полно.
    Есть и готовые реализации данного шаблона.

    Да, и вовсе не обязательно ограничивать количество потоков количеством ядер. Вы вполне можете использовать большее количество потоков, советую поэкспериментировать с количеством, замеряя скорости исполнения, пока не добьётесь оптимального результата.
    Ответ написан