Правила программирования

Проработать:

  1. Принцип открытости/закрытости
  2. Архитектурные паттерны
  3. Stop Recommending Clean Code
  4. Design a Payment System - System Design Interview
  5. Базовые паттерны из каталога PoEAA

Основные разделы:

Patterns

Others

Отношения между классами/объектами:

  1. Наследование - позволяет одному классу (наследнику) унаследовать функционал другого класса.
  2. Реализация - определение интерфейса и его реализация в классах.
  3. Ассоциация состоит из двух типов:
    • Агрегация – это свободный тип отношения между объектами – как между компьютером и его периферийным оборудованием.
    • Композиция – это очень строгий тип отношения между объектами – как между деревом и его листьями.

DRY

DRY(don’t repeat yourself) - код не должен дублироваться.

KISS

KISS(Keep it simple, stupid) - следует избегать ненужной сложности.

YAGNI

YAGNI(You aren't gonna need it) - не создавать то что не требует задача. Не нужно предсказывать будущее, задачи меняются.

Другие паттерны

Guard Clauses

Замена if - else if - else структуры на if, для повышение читаемости.

function doSomething() {
    if (userActive) {
        if (userSubscribed) {
            if (isPaidUser) {
                doSomething();
            } else {
                new Error("Not a pro user");
            }
        } else {
            new Error("User not subscribed");
        }
    } else {
        new Error("User not active");
    }
}
        
function doSomething() {
    if (!userActive) {
        new Error("User not active");
    }

    if (userSubscribed) {
        new Error("User not subscribed");
    }

    if (isPaidUser) {
        new Error("Not a pro user");
    }

    doSomething();
}
        

LRU Cache - least recently use

LRU - алгоритм вытесняющий значения которые дольше всего не запрашивались. Соответственно, необходимо хранить время последнего запроса к значению. И как только число закэшированных значений превосходит N необходимо вытеснить из кеша значение, которое дольше всего не запрашивалось.

Для реализации этого метода нам понадобятся две структуры данных:

  1. Хеш-таблица hashTable, которая будет хранить непосредственно закэшированные значения.
  2. Очередь с приоритетами timeQueue. Структура, которая поддерживает следующие операции:
    • Добавить пару значение и приоритет timeQueue.Add(val, priority).
    • Извлечь (удалить и вернуть) значение с наименьшим приоритетом timeQueue.extractMinValue().