Skip to content

Files

Latest commit

 

History

History
465 lines (292 loc) · 34.4 KB

programming_oop.md

File metadata and controls

465 lines (292 loc) · 34.4 KB

Общие вопросы по программированию и ООП с собеседований

  1. Что такое ООП? Назвать 3 принципа ООП и их значение?

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

    Основные принципы ООП:

    Инкапсуляция, Наследование и Полиморфизм

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

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

    2 Пример: Это эволюция человека из обезьяны.

    3 Пример: Кресло и табуретка и на том и на том можно сидеть, но у кресла есть еще и мягкая часть

    • Полиморфизм — объекты с одинаковой спецификацией, могут иметь разные реализации.

    1 Пример: Собаки и кошки могут издавать звук, гавкать и мяукать, хотя спецификация у них одна — животное.

    2 Пример: Класс автомобиль — это абстрактный класс, но у него есть полиморфные объекты, к примеру мой авто и авто моего соседа, разные, разный цвет, тип двигателя, салон, собственник авто

    • Интерфейс — Совокупность публичных методов объекта составляют его интерфейс. Все что видно и не скрыто в private и protected.

    Возможность перекрывать методы в потомках — полиморфизм.

  2. Чем отличаются статическая и динамическая типизации в языках программирования?

    Ответ Статическая типизация — принцип программирования, когда переменная связывается с определённым типом в момент объявления и её тип не может быть изменён позже.

    Например, a — это Integer. В этом случае позже мы не сможем присвоить, например, значение a = "slovo", это вызовет ошибку.

    Статическая типизация используется языками Ada, C, C++, C#, Go, JADE, Java, Fortran, Haskell, ML, Pascal, Scala.

    Динамическая типизация — противоположный принцип программирования, когда переменная связывается с типом в момент присваивания значения, а не в момент объявления. Таким образом, одной и той же переменной в разных участках программы можно присваивать значения различных типов.

    Динамическая типизация используется языками Perl, Smalltalk, Python, Objective-C, Ruby, JavaScript, TypeScript, Groovy, ColdFusion, Lua, Lisp, PHP.

    https://www.youtube.com/watch?v=1dwJvRw_h7A&t=168

  3. Чем отличаются сильная и слабая типизации в языках программирования?

    Ответ Сильная типизация — принцип, при котором взаимодействующие объекты должны быть совместимыми по типу.

    Например, выражение x = 5 + "y" вызовет ошибку в Ruby.

    Языки с сильной типизацией: Java, Ruby, Python, Haskell, Lisp.

    Слабая типизация — обратный принцип, при котором взаимодействующие объекты могут быть несовместимыми по типу и это не вызовет ошибку.

    Например, выражение $x = 5 + "y" не вызовет ошибку, присвоит переменной значение 5.

    Языки со слабой типизацией: C, JavaScript, Visual Basic, PHP.

    https://www.youtube.com/watch?v=1dwJvRw_h7A&t=284

  4. Чем отличаются явная и неявная типизации в языках программирования?

    Ответ Явная типизация — принцип, при котором тип новых переменных нужно задавать явно.

    Языки с явной типизацией: C++, Delphi, C#, Java

    Неявная типизация — принцип, при котором интерпретатор/компилятор сам определеяет тип переменной.

    Языки с неявной типизацией: Ruby, Python, PHP, Lua, JavaScript, Perl.

    https://ru.wikipedia.org/wiki/Явное_назначение_типов

  5. Что такое duck typing?

    Ответ Вид динамической типизации, применяемой в некоторых языках программирования.

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

    Если объект обладает необходимыми методами, которыми должен обладить, то мы считаем что это нужный нам объект.

  6. Принципиальное различие скриптовых и «обычных» языков?

    Ответ Скриптовый язык программирования — язык программирования, разработанный для записи «сценариев», последовательностей операций, которые пользователь может выполнять на компьютере.

    Интерпретируется с помощью интерпретатора. Имеет динамическую типизацию.

    Интерпретация — пооператорный (покомандный, построчный) анализ, обработка и тут же выполнение исходной программы или запроса (в отличие от компиляции, при которой программа транслируется без её выполнения).

  7. Что такое namespace и зачем их используют?

    Ответ

    namespace — это пространство имен, обычно используется для разделения функционала и названием классов.

    К примеру:

    • Admin::User
    • Moderator::User
    • Editor::User
  8. В чем разница между процессом и потоком?

    Ответ Процесс — экземпляр программы во время выполнения. Имеет хот я бы 1 поток. Два процесса не знают друг о друге без настройки межпроцессорного взаимодействия. Потоки же совместно используют данные своих состояний. Поток — определенный способ выполнения процесса. Когда один поток изменяет ресурс процесса, это изменение сразу же становится видно другим потокам этого процесса.

    Подробнее тут

  9. Объяснить, что такое кеширование? Какое бывает кэширование?

    Ответ Кэширование — это один из способов оптимизации Web приложений. В любом приложении встречаются медленные операции (SQL запросы или запросы к внешним API), результаты которых можно сохранить на некоторое время. Это позволит выполнять меньше таких операций, а большинству пользователей показывать заранее сохраненные данные(кэш браузера).
  10. Куда быстрее добавить элемент в массиве(хеше) в середину или в конец?

    Ответ В конец, так как сначала нужно выгрузить все значения, пройтись по ним, определить порядок и затем добавить в начало, в конец просто добавляется
  11. Какие есть 3 уровня контроля доступа для методов в классе? Объяснить каждый.

    Ответ
    • public — это общий метод классов, не указывается в коде.
    • private — вызывается только внутри методов класса, без вывода вне класса из вне.
    • protected — вызывается всеми классами и доступен дочерним классам для переопределения. SportCar < Car.

    Если метод будет доступен клиенту — public, если нет это private.

    Единственное отличие private от protected — в private нельзя вызывать методы self, в protected можно. Есть соглашение — private используется только если не нужно давать доступ дочерним классам.

  12. Что такое класс? Что такое объект (экземпляр класса)? В чём разница?

    Ответ Класс — это особый элемент, описывающий структуру объекта и его реализацию.

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

    Класс — это особый объект, который несёт в себе знания о всех методах своих экземпляров (instance methods). При помощи метода класса .new можно создавать неограниченное число таких экземпляров.

    Экземпляр класса — это готовая сущность класса.

    К примеру, класс Собака, имеет в себе модель, которая бегает на 4 лапах, гавкает и не любит кошек.

    В свою очередь в классе Собака можно выделить классы Лабрадор, Доберман, Сенбернар и т.д. Они наследуют определённые методы и переменные от класса Собака, но имеют и свои.

    И уже по этим классам, как по чертежам, можно изготовить новые объекты (экземпляры класса) с набором заготовленных характеристик — Шарик, Мухтар, Каштанка и т.д.

  13. Что такое конструктор? Инициализация объекта?

    Ответ

    Конструктор это метод initialize, который создается в момент инициализации класса.

    Обычно в инишалайзе сразу указывают набор полей, к примеру нулевую скорость, высоту, позитивные значения initialize задает состояние объекта.

  14. Что такое MVC? Почему его используют?

    Ответ MVC — Model, View, Controller. Это паттерн программирования используемый в Rails.

    В нем есть четкое разграничение что за что отвечает.

    https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller

  15. Как взаимодействуют компоненты MVC между собой? Схема паттерна в общем виде.

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

    Схема взаимодействия

  16. Что такое REST? Почему его используют?

    Ответ Архитектурный стиль взаимодействия компонентов распределённого приложения в сети

    REST — достаточно распространенный в интернете способ взаимодействия клиентских приложений и сервисов.

    Сервис, написанный с учетом ограничений и правил REST принято называть RESTful.

    То есть REST — это набор принципов и ограничений взаимодействия клиента и сервера в сети интернет, использующий существующие стандарты (HTTP протокол, стандарт построения URL, форматы данных JSON и XML) в ходе взаимодействия.

    Взаимодействие с ресурсами осуществляется с помощью вызова URL ресурса и стандартных команд HTTP (GET, POST, PUT и DELETE).

    Эти операции обычно соответствуют операциям с объектом, например, так:

    • Create POST (с пустым ID объекта)
    • Read GET
    • Update PUT (с существующим ID объекта)
    • Delete DELETE

    http://sap.pitroff.ru/tehnologii/rest/rest-eto-ne-pro-otdyih-chast-pervaya-chto-takoe-rest/

    https://code.tutsplus.com/ru/tutorials/a-beginners-guide-to-http-and-rest--net-16340

    https://en.wikipedia.org/wiki/Representational_state_transfer

    http://eax.me/rest/

  17. Что такое CRUD?

    Ответ Cокращённое именование 4 базовых функций при работе с хранилищами данных приложения.

    В Rails ресурсный маршрут предоставляет сопоставление между методами HTTP и URL к экшнам контроллера.

    По соглашению, каждый экшн также соединяется с определенной операцией CRUD в базе данных.

    • GET /photos photos#index отображает список всех фото
    • GET /photos/new photos#new возвращает форму HTML для создания нового фото
    • POST /photos photos#create создает новое фото
    • GET /photos/:id photos#show отображает определенное фото
    • GET /photos/:id/edit photos#edit возвращает форму HTML для редактирования фото
    • PATCH/PUT /photos/:id photos#update обновляет определенное фото
    • DELETE /photos/:id photos#destroy удаляет определенное фото
  18. Правила построения REST API.

    Ответ https://code.tutsplus.com/ru/tutorials/a-beginners-guide-to-http-and-rest--net-16340
  19. Где должна быть логика в приложении?

    Ответ Логика должна быть только в моделе, контроллеры и вьюхи ничего не должны знать о бизнес-логике, используется формулировка толстые-модели и тонкие контроллеры.
  20. Для чего нужны миграции?

    Ответ Миграции - это удобный способ изменять схему вашей базы данных всё время неизменным и простым образом. Они используют Ruby DSL. Поэтому вам не нужно писать SQL вручную, позволяя вашей схеме быть независимой от базы данных.
  21. Синхронные и асинхронные операции — предложить варианты решения.

  22. Что такое Strong Params?

    Ответ С помощью сильных параметров (strong parameters) параметры Action Controller запрещены к использованию в массовых назначениях Active Model до тех пор, пока они не добавлены в белый список. Это означает, что нужно будет принять осознанное решение о том, какие атрибуты будут доступны для массового обновления. Это лучший способ предотвратить случайную уязвимость, позволяющую пользователям обновлять чувствительные атрибуты модели.
    private
    
    def person_params
      params.require(:person).permit(:name, :age)
    end

    Подробнее тут

  23. Что такое KISS, DRY, SOLID, YAGNI?

    Ответ KISS — Keep it simple stupid ( Пиши очень простой код и очень легкий (тупой) ). Достигается в основном с помощью рефакторинга.

    https://ru.wikipedia.org/wiki/KISS_(%D0%BF%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF)

    DRY — Don't repeat yourself ( не повторяй самого себя ). Если есть логика которая повторяется более 2 раз, ее необходимо выносить в отдельный класс/метод. Например мы используем dry, когда пишем контроллеры, так как у нас есть необходимость нахождения params, мы выносим данный метод по их поиску в отдельный метод find_params.

    https://ru.wikipedia.org/wiki/Don%E2%80%99t_repeat_yourself

    YAGNI — You are not gonna need it — тебе это не нужно сейчас. Не писать больше того, перед чем тебе ставят задачу.

    https://ru.wikipedia.org/wiki/YAGNI

    SOLID

    S — Принцип единственной ответственности (пример повара, официанта, гостя, они не делают что-то не из своего предназначения).

    O — Принцип открытости и закрытости ( Закрытие изменений для одного из классов, можно сделать только ответвление и наследоваться ).

    L — Принцип подстановки Барбары Лисков ( все что делает родительский класс, должен делать и дочерний класс, класс собака должен знать и вызываться от класса животные ).

    I — API для клиентов должен иметь только те функции, которые ему нужны, не более. Если есть проблема с этим, нужно разбить на несколько маленьких интерфейсов задачу.

    D — Класс не должен зависеть от от конкретного ПО, он должен зависеть от абстракции. Пример база данных СКЛ, сменить на базу данных Oracle or Postgres. Абстракции не должны зависеть от деталей, так как в свою очередь детали должны зависеть от абстракции.

    https://en.wikipedia.org/wiki/SOLID

  24. Какие паттерны проектирования знаете?

    Ответ Есть несколько паттернов, которыми нужно пользоваться:

    https://github.com/davidgf/design-patterns-in-ruby

    https://mkdev.me/posts/neskolko-patternov-dlya-napisaniya-nadyozhnogo-ruby-koda

    https://medium.com/@kopilov.vlad/%D1%86%D0%B8%D0%BA%D0%BB-%D1%81%D1%82%D0%B0%D1%82%D0%B5%D0%B9-%D0%BF%D0%B0%D1%82%D1%82%D0%B5%D1%80%D0%BD%D1%8B-%D0%BE%D0%BE%D0%BF-%D0%B2-ruby-46666b260303

    https://refactoring.guru/ru/design-patterns

  25. Что такое синглтон класс?

    Ответ Singletone class является единственным экземпляром класса и остается не изменным, его нельзя вызвать через new, так как нельзя сделать много его копий.
    require 'singleton'
    
    class SuperClass
      include Singleton
    
      def hello
        puts "Hello, I'm an instance of SuperClass and my ID is #{object_id}"
      end
    end

    Вызов класса возможен только через .instance.

  26. Что такое толстые модели и тонкие контроллеры?

  27. Что лучше: толстые модели и тонкие контроллеры либо толстые контроллеры и тонкие модели? Аргументировать.

  28. Что такое Monkey patching?

    Ответ Наследование позволяет переиспользовать и дополнять классы родителей и пользоваться дополнением классов родителей, не заботясь о дублировании кода, который необходимо будет менять в нескольких местах.
    > require 'active_record'
     => true
    > {a:1, b:2}.sum
     => [:a, 1, :b, 2]

    Грубая ошибка и переопределенность основного класса.

    Где искать ответы:

  29. Что такое ORM?

    Ответ Object Relational Mapper.

    Это набор классов, которые предоставляют объектно-ориентированный интерфейс для базы данных.

    Обычно упоминающееся как аббревиатура ORM, это техника, соединяющая сложные объекты приложения с таблицами в системе управления реляционными базами данных. С помощью ORM, свойства и взаимоотношения этих объектов приложения могут быть с легкостью сохранены и получены из базы данных без непосредственного написания выражений SQL, и, в итоге, с меньшим суммарным кодом для доступа в базу данных.

    ORM (англ. Object-relational mapping) — технология программирования, которая связывает базы данных с концепциями объектно-ориентированных языков программирования, создавая «виртуальную объектную базу данных

    http://rusrails.ru/active-record-basics

  30. Какие различия между паттернами MVC, MVVM, MVP, PM

    Ответ https://habr.com/company/mobileup/blog/313538/