Собеседование: самая любимая задача по ООП (C#)

Опубликовано Dec 26, 2012 в ООП, Простые проекты для учебы | 21 коммент.

, , ,

Собеседование: самая любимая задача по ООП (C#)
Эту задачу делают как лабораторную работу все и везде  и ее очень часто дают на собеседованиях как практический тест на владение основами ООП вместе с остальными абсолютно необходимыми вещами. Конкретно в этой постановке ее принесли откуда-то студенты. Скорее всего, она использовалась как реальная задача на каких-то собеседованиях, но восстановить первоисточник затруднительно, да и нет в этом особого смысла – по приведенному шаблону можно написать сотни условий.
 

ИТАК, САМА ЗАДАЧА

Построить три класса (базовый и 2 потомка), описывающих некоторых работников с почасовой оплатой (один из потомков) и фиксированной оплатой (второй потомок). Описать в базовом классе абстрактный метод для расчета среднемесячной заработной платы. Для «повременщиков» формула для расчета такова: «среднемесячная заработная плата = 20.8 * 8 * почасовую ставку», для работников с фиксированной оплатой «среднемесячная заработная плата = фиксированной месячной оплате».

  • a) Упорядочить всю последовательность работников по убыванию среднемесячного заработка. При совпадении зарплаты – упорядочивать данные по алфавиту по имени. Вывести идентификатор работника, имя и среднемесячный заработок для всех элементов списка.
  • b) Вывести первые 5 имен работников из полученного в пункте а) списка.
  • c) Вывести последние 3 идентификатора работников из полученного в пункте а) списка.
  • d) Организовать запись и чтение коллекции в/из файл.
  • e) Организовать обработку некорректного формата входного файла.

СРЕДСТВА И УСЛОВИЯ ВЫПОЛНЕНИЯ

Компьютер со знакомой соискателю IDE (подразумеваем MS Visual Studio) без доступа в Интернет и достаточно жесткие временные рамки такие, что времени на чтение документации, даже если к ней есть доступ, не хватит.

РЕКОМЕНДАЦИИ: КАК ДЕЛАТЬ НА СОБЕСЕДОВАНИИ

1) Как проектировать классы сущностей, – можно особенно не задумываться, все описано очень подробно, нужно только это реализовать. Разумеется, вводя поле/поля для хранения либо почасовой ставки, либо фиксированной месячной оплаты, нужно избежать дополнительных флагов, которые объясняют, что данное число обозначает (так сделает больше половины). Следовательно, опускаем эти данные в производные классы.
2) Необходим класс, реализующий полиморфный контейнер, над которым будут выполняться действия из пунктов a) – e). Вот здесь стоит сначала немного подумать – как наиболее оптимально еализовать сортировку, простейшие выборки и ввод/вывод с обработкой ошибок.

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

3) Еще нужно принять решение – делать контейнер статическим (например, Array) или динамическим (например, List<>). В условии нигде не упомянуты действия по удалению/добавлению объектов в контейнер. Следовательно, для реализации только описанной функциональности достаточно статического контейнера, размер которого определяется количеством актуальных данных во входном файле (любое количество объектов). Желательно избежать в коде присутствия цифирки, которая задает максимально возможное количество элементов контейнера. Программируя методы контейнерного класса, желательно продемонстрировать владение наиболее широким арсеналом средств языка.
4) Ввод/вывод. При всей банальности этого места, оно может оказаться проблемным. Во-первых, слишком много вариантов, и обычно тратится время на выбор какого-то из них. Во-вторых, нужен файл с исходными данными, то есть нужно определиться с его форматом и набить его без ошибок – а это может оказаться самой затратной по времени частью задачи.

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

Поэтому есть такой вариант. Входные данные первоначально генерируются программно с использованием каких-то рандомизаторов. Потом пишется функциональность вывода этих данных в файл – она ведь все равно требуется по условию. И в финале – пишем функциональность чтения данных из файла. Средства работы с XML в C# очень продвинутые – можно двумя-тремя строчками написать код, который прочитает/запишет любую таблицу в XML-файл стандартного формата. То есть о формате файла можно вообще не задумываться.

И еще – не забывайте, что классы потоков для работы с файлами наследуют IDisposable.

5) Обработка некорректного формата входного файла. Требование очень расплывчато для каких-то конкретных действий по поводу того, как должны выполняться задачи a), b), c) при каких-то (каких???) ошибках во входном файле.  Но всегда имеется входной файл, который может быть прочитан ожидаемым образом. Всякие другие форматы, скорее всего, при чтении сгенерируют  исключение. Его-то и нужно обработать простейшим образом – сообщить о нем пользователю и выйти из программы без выполнения каких-либо дальнейших действий.

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

Этот код рекомендуется к использованию для различных обучающих программ. Его ни в коем случае нельзя рассматривать как результат коммерческой деятельности компании FulcrumWeb


Автор публикации: