Читать книгу Карьера программиста. Как устроиться на работу в Google, Microsoft или другую ведущую IT-компанию - Гейл Макдауэлл - Страница 36

Часть VIII. Вопросы собеседования
Концепции и алгоритмы. Вопросы и советы
8. Объектно-ориентированное проектирование

Оглавление

Задания по объектно-ориентированному проектированию (ООП) предполагают, что кандидат может составить схему из классов и методов, позволяющую реализовать техническую задачу или имитировать реальный объект. Эти задачи дают интервьюеру возможность составить представление о стиле программирования кандидата.

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

Как подготовиться к заданиям по ООП

Независимо от того, о чем идет речь – о материальном объекте или технической задаче, – решение ООП-задания может идти по стандартному пути. Приведенный далее подход пригодится для решения многих задач.


Шаг 1. Избавьтесь от неоднозначностей

Вопросы по ООП иногда содержат специально добавленные неопределенности. Это делается для того, чтобы проверить, будете ли вы высказывать предположения или будете задавать уточняющие вопросы. В конце концов, разработчик, который пишет программы, должен сознавать, что его действия могут не только привести к потере времени и денег компании, но и создать более серьезные проблемы.

Задавая уточняющие вопросы по задачам ООП, вы выясняете, кто и как будет использовать ваш программный продукт. В этом диалоге вам следует руководствоваться правилом шести W (who, what, where, when, how, why) – кто, что, где, когда, как, почему.

Например, предположим, что вас попросили написать ООП-модель кофеварки. Задание выглядит однозначным? Увы, это не так.

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


Шаг 2. Определите основные объекты

Теперь, когда мы понимаем, что будем проектировать, необходимо выделить основные объекты системы. Если мы будет разрабатывать кофеварку для ресторана, основными объектами будут Table, Guest, Party, Order, Meal, Employee, Server и Host.


Шаг 3. Анализируем связи

Основные объекты выделены, теперь нужно проанализировать связи между ними. Какие члены должны присутствовать в наших объектах? Есть ли объекты, которые наследуют от каких-либо других объектов? Какая связь используется – «многие-комногим» или «один-ко-многим»?

В случае с ресторанной кофеваркой, проект будет иметь вид:

• в Party присутствует массив Guests;

• Server и Hosts наследуются от Employee;

• у каждого Table есть один Party, но у каждого Party может быть несколько Table;

• один Host для Restaurant.

Будьте очень осторожны – вы можете сделать неправильные предположения. Например, стол (Table) может быть общим для нескольких Party, – так называемый «общий стол» в некоторых модных тусовочных местах. Вы должны обсудить со своим интервьюером цель проекта.


Шаг 4. Исследуйте действия

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

Например, компания (Party) идет в ресторан (Restaurant) и гости (Guests) интересуются свободным столиком (Table) у официанта (Host). Официант просматривает список резервирования (Reservation) и, если есть свободные места, компания (Party) занимает столик (Table). Если свободных мест нет, компания становится в очередь (в конец списка). Когда компания уходит, стол освобождается и его занимает следующая по порядку в очереди компания.

Разработка шаблонов

Поскольку интервьюеры пытаются протестировать ваши возможности, а не ваши знания, разработка шаблонов чаще всего остается за рамками собеседования. Однако шаблоны Singleton (одиночка) и Factory Method (фабричный метод) могут пригодиться, и мы остановимся на них поподробнее.

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

Singleton

Шаблон Singletonгарантирует, что класс имеет только один экземпляр и обеспечивает доступ к экземпляру через приложение. Он может быть полезен в том случае, когда у вас есть «глобальный» объект с одним экземпляром. Например, мы можем реализовать класс Restaurant так, чтобы существовал единственный экземпляр Restaurant.

1 public class Restaurant {

2 private Restaurant _instance = null;

3 public static Restaurant getInstance() {

4 if (_instance == null) {

5 _instance = new Restaurant();

6 }

7 return _instance;

8 } 9 }

Factory Method

Фабричный метод предлагает интерфейс, позволяющий подклассам создавать экземпляры некоторого класса. Вам может понадобиться реализовать эту задачу с классом Creator, который является абстрактным, не способным обеспечить реализацию фабричного метода. Или же класс Creator может оказаться реальным классом, обеспечивающим реализацию этого метода. Тогда фабричный метод будет принимать параметр, определяющий, какой класс нужно инициализировать.

1 public class CardGame {

2 public static CardGame createCardGame(GameType type) {

3 if (type == GameType.Poker) {

4 return new PokerGame();

5 } else if (type == GameType.BlackJack) {

6 return new BlackJackGame();

7 }

8 return null;

9 } 10 }

Вопросы собеседования

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

8.2. Предположим, что существует Call-центр с тремя уровнями сотрудников: оператор, менеджер и директор. Входящий телефонный звонок адресуется свободному оператору. Если оператор не может обработать звонок, он автоматически перенаправляется менеджеру. Если менеджер занят, звонок перенаправляется директору. Разработайте классы и структуры данных для этой задачи. Реализуйте метод dispatchCall(), который перенаправляет звонок первому свободному сотруднику.

8.3. Разработайте музыкальный автомат, используя принципы ООП.

8.4. Разработайте паркинг, используя принципы ООП.

8.5. Разработайте структуры данных для онлайн-библиотеки.

8.6. Запрограммируйте игру в пазл. Разработайте структуры данных и объясните алгоритм, позволяющий решить задачу. Вы можете предположить, что существует метод fitsWith, возвращающий значение true в том случае, если два переданных кусочка пазла должны располагаться рядом.

8.7. Как вы будете разрабатывать чат-сервер? Предоставьте информацию о компонентах бэкэнда, классах и методах. Перечислите самые трудные задачи, которые необходимо решить.

8.8. Правила игры «реверси» следующие. Каждая фишка в игре с одной стороны белая, а с другой – черная. Когда ряд фишек оказывается ограничен фишками противника (слева и справа или сверху и снизу), его цвет меняется на противоположный. Цель – захватить по крайней мере одну из фишек противника. Игра заканчивается, когда у игрока не остается ходов. Побеждает тот, у которого больше фишек на поле. Реализуйте ООП-модель для этой игры.

8.9. Объясните, какие структуры данных и алгоритмы необходимо использовать для разработки файловой системы, хранящейся в оперативной памяти. Напишите программный код, иллюстрирующий использование этих алгоритмов.

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


Дополнительные вопросы: потоки и блокировки (16.3).

Карьера программиста. Как устроиться на работу в Google, Microsoft или другую ведущую IT-компанию

Подняться наверх