Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

+737новых вакансий за сутки·51 861вакансия открыта сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании5 706
РезюмеAIПодготовкаСтатьи
ТарифыТарифы
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 391 кандидат открыт к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python5 436
  • Облачные технологии4 071
  • QA вакансии1 587
  • Android1 093
  • Инженер данных782
  • Продакт-менеджер310

Разработка

  • iOS1 047
  • Backend вакансии986
  • Fullstack вакансии437
  • Frontend вакансии354
  • AI вакансии350
  • Mobile вакансии27

По стеку

  • Go2 987
  • Java1 810
  • Kotlin868
  • Node.js675
  • .NET436
  • Rust435
  • PHP248
  • C++204
  • C#190

DevOps и инфраструктура

  • Kubernetes2 306
  • Linux-инфраструктура1 890
  • DevOps вакансии1 675
  • Terraform / IaC1 405
  • CI/CD841
  • Мониторинг и Observability645
  • SRE217
  • Кибербезопасность46

Аналитика и данные

  • Аналитик данных476
  • Data Scientist450
  • Бизнес-аналитик341
  • Системный аналитик48

Другие направления

  • Проджект-менеджер103
  • UI/UX дизайн70
  • Ручное тестирование14

По регионам

  • Вакансии в США23 809
  • Вакансии в Европе9 134
  • Работа в России2 924
  • Вакансии в Канаде2 119

По формату

  • Удалённые вакансии41 654
  • Релокация в США23 809
  • Гибридная работа3 374
  • Офисная работа2 525

По уровню

  • Senior вакансии20 056
  • Middle вакансии11 874
  • Junior вакансии3 682

Сейчас нанимают

Все компании
  • Rakuten188 вакансий
  • ASML163 вакансии
  • Grab134 вакансии
  • Wise71 вакансия
  • Infobip28 вакансий
  • Darktrace17 вакансий
  • Spotify14 вакансий
  • Celonis11 вакансий
  • Razorpay9 вакансий
  • Adyen8 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К теме C++Все вопросы
C++MiddleПроектирование систем

Что такое принципы SOLID и как они применяются в C++?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

SOLID в C++ реализуется через виртуальные функции (OCP, LSP), шаблоны и концепты (ISP, DIP), а также строгое разделение заголовков (SRP). Концепты C++20 дают статическую проверку интерфейсных контрактов.

S — Single Responsibility Principle

Класс должен иметь единственную причину для изменения.

#include <string>
#include <fstream>

// Нарушение: класс и хранит данные, и сериализует, и логирует
class UserBad {
public:
    std::string name;
    void saveToFile(const std::string& path); // SRP-нарушение
    void log();                               // SRP-нарушение
};

// Соблюдение: разделение ответственности
struct User { std::string name; int id; };

class UserRepository {
public:
    void save(const User& u, const std::string& path) {
        std::ofstream f(path);
        f << u.id << " " << u.name << "\n";
    }
};

Принципы SOLID в C++

O — Open/Closed Principle

Открыт для расширения, закрыт для изменения.

#include <memory>
#include <vector>

struct Shape {
    virtual double area() const = 0;
    virtual ~Shape() = default;
};

struct Circle : Shape {
    double r;
    explicit Circle(double r) : r(r) {}
    double area() const override { return 3.14159 * r * r; }
};

struct Rectangle : Shape {
    double w, h;
    Rectangle(double w, double h) : w(w), h(h) {}
    double area() const override { return w * h; }
};

double totalArea(const std::vector<std::unique_ptr<Shape>>& shapes) {
    double sum = 0;
    for (const auto& s : shapes) sum += s->area();
    return sum;
    // Новую фигуру добавляем без изменения этой функции
}

L — Liskov Substitution Principle

// Нарушение: Rectangle vs Square — классический антипаттерн
struct Rectangle {
    virtual void setWidth(int w)  { w_ = w; }
    virtual void setHeight(int h) { h_ = h; }
    int area() const { return w_ * h_; }
protected:
    int w_ = 0, h_ = 0;
};

// Square переопределяет setWidth/setHeight — нарушает LSP
// Решение: не наследовать Square от Rectangle
// Используйте независимые типы или концепты

I — Interface Segregation Principle

// Нарушение: один жирный интерфейс
struct IWorker {
    virtual void work()  = 0;
    virtual void eat()   = 0;  // роботы не едят!
    virtual void sleep() = 0;
};

// Соблюдение: мелкие интерфейсы
struct IWorkable { virtual void work()  = 0; virtual ~IWorkable() = default; };
struct IFeedable  { virtual void eat()   = 0; virtual ~IFeedable()  = default; };

struct Robot    : IWorkable { void work() override { /* ... */ } };
struct Employee : IWorkable, IFeedable {
    void work() override { /* ... */ }
    void eat()  override { /* ... */ }
};

D — Dependency Inversion Principle + C++20 Concepts

#include <concepts>

// Абстракция через concept (статическая DIP)
template<typename T>
concept Logger = requires(T t, std::string_view msg) {
    { t.log(msg) } -> std::same_as<void>;
};

struct ConsoleLogger {
    void log(std::string_view msg) {
        std::puts(msg.data());
    }
};

struct FileLogger {
    void log(std::string_view msg) { /* write to file */ }
};

template<Logger L>
class Service {
    L& logger_;
public:
    explicit Service(L& l) : logger_(l) {}
    void doWork() {
        logger_.log("Starting work");
    }
};

// Использование
ConsoleLogger cl;
Service service(cl);  // CTAD, нет виртуальных вызовов

Подводные камни

  • Виртуальное наследование для реализации ISP даёт накладные расходы — vtable на каждый интерфейс. C++20 concepts дают нулевую стоимость через статический полиморфизм.
  • LSP-нарушения в иерархиях наследования часто обнаруживаются не в compile-time, а в runtime. Концепты и статические проверки (static_assert) позволяют сдвинуть ошибки влево.
  • Злоупотребление DIP через интерфейсы создаёт избыточную косвенность — в performance-sensitive C++ коде предпочитайте шаблоны и concepts над виртуальными функциями.
  • SRP в C++ осложняется тем, что разбиение на мелкие классы увеличивает количество заголовков и время компиляции — баланс между чистотой и build performance важен.
  • Open/Closed через виртуальные функции требует stable ABI — добавление нового чисто виртуального метода в базовый класс ломает всех наследников.
  • Шаблонная DIP (concepts) не поддерживает runtime-подмену реализации — для мокирования в тестах всё равно нужны виртуальные функции или type erasure (std::function, std::any).

Частые вопросы на собеседовании

  • Что такое undefined behavior в C++ и приведите примеры?
  • Что такое smart pointers в C++? Объясните unique_ptr, shared_ptr и weak_ptr.
  • Что такое правило трёх / правило пяти / правило нуля (Rule of Three / Five / Zero)?
  • Что такое RAII (Resource Acquisition Is Initialization) и почему это важно?

Типичные ошибки

  • Объяснять SOLID в C++ только по синтаксису, без жизненного цикла и стоимости.
  • Игнорировать ошибки, null/empty состояния, порядок инициализации или режим сборки.
  • Давать пример, который работает в демо, но ломается при изменении владельца ресурса.
  • Показывать сырой указатель без объяснения владельца и момента освобождения.

Что проверяет интервьюер

  • Кандидат формулирует точную модель для SOLID в C++, а не только определение.
  • Пример компилируем, безопасен по lifetime и соответствует версии технологии.
  • Названы trade-off, ограничения и диагностируемые симптомы ошибки.

Как вы знаете этот вопрос?

Проверить себя по теме C++ →

Источники

  • https://isocpp.org/wiki/faq/strange-inheritance
←Предыдущий вопросРасскажите о случае, когда особенности C++ повлияли на архитектурное решение, производительность или сопровождение проекта.Следующий вопрос→Каковы наиболее распространённые ошибки работы с памятью в C++ (dangling pointers, утечки памяти, buffer overflow) и как их обнаруживать?

Связанные темы

C++Debuggingmemory-managementperformance-tradeoffs