Подтвердить что ты не робот

ООП: Какой класс должен иметь метод?

Мне трудно понять, как классы относятся к их методам. Является ли метод тем, что делает объект, или что-то, что он сделал? Или это совсем другое понятие?

В частности, в программной системе библиотеки, если метод borrow() принадлежит классу, представляющему патрона библиотеки, или классу, представляющему элемент, который заемщик занимает? Моя интуиция заключается в том, что она должна читаться как patron.borrow(copy), например, структура английского предложения, subject.verb(object); но мой инструктор говорит, что это неправильно, и я не понимаю, почему он должен был borrow() принадлежать классу Copy (и он не слишком хорошо объясняет ситуацию). Я не ищу оправдания, но может ли кто-то просто объяснить правильные отношения?

Изменить: этот вопрос был закрыт как "вне темы". Я не понимаю. Вопросы по дизайну программного обеспечения не подходят для этого сайта?

4b9b3361

Ответ 1

Сначала произносите несколько общих слов.

Разработка программного обеспечения не является чем-то, что должно регулироваться правилами английского языка или "красотой" или что-то еще, это инженерная дисциплина. Подумайте, решает ли ваш проект проблему, будет ли она пригодна для обслуживания, будет ли она проверкой, будет ли возможность распараллеливать разработку и так далее. Если вы хотите что-то более формализованное, взгляните на "О критериях, которые будут использоваться в системах разложения в модули" Д. Л. Парнаса.

Что касается примера вашей библиотеки. Представьте, что у вас есть копия вне библиотеки, тогда у нее есть метод borrow? Как регистрируется заимствование? Вы в порядке с классами Copy или Patron, ответственными за хранение данных? Уместнее положить borrow в класс библиотеки. Обязанности будут четко разделены, вам не нужно будет много знать о заимствованиях для реализации Copy and Patron, и вам не нужно будет подробно рассказывать о них для реализации библиотеки.

Ответ 2

субъективный:), но, честно говоря, я бы пошел с Информационный шаблон эксперта и сказал что-то вроде

library.lend(item, patron)

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

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

Ответ 3

Не следует путать идею ООП с одной конкретной инкарнацией, например, Java или С++.

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

Сколько методов имеет объект "целочисленное число"? Что более логично... myfile.write(myint) или myint.write(myfile)? На самом деле нет хорошего общего ответа на этот вопрос. Идея метода, являющегося частью одного объекта, является частным случаем, и иногда изгиб, необходимый для решения этой проблемы, может стать заметным или даже приближенным к showstopper. Ответ действительно полностью приемлем только в том случае, если у метода нет параметров, кроме обрабатываемого объекта: единая отправка является идеальным ответом только при наличии одного типа.

В других языках у вас есть разделение между объектами и методами, поэтому, например, у вас есть файл-объект, целочисленный объект и метод write(myfile, myint), который описывает, что делать, когда требуется операция... и этот метод ни часть файла, ни целое число.

Ответ 4

Как сказал @Ryan Fernandes, операция кредитования/заимствования не может быть ни с покровителем, ни с книгой. Это должно быть с некоторым классом, который знает о статусе всех книг и покровителей библиотеки. Например, существуют ли ожидающие оговорки к книге? Сколько копий доступно? Получил ли этот патрон все пошлины? Имеет ли он право на эту книгу? Обычно это должно быть в библиотеке или в классе LibraryService.

Ответ 5

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

Например: если я скажу

Computer.TurnOn()

Метод будет работать только в компьютерной системе.

вместо этого, если я скажу,

SomeOne.TurnonComputer()

Теперь у кого-то будет возможность включить компьютер (установить связанные свойства компьютера), что означает, что мы не отвечаем концепции инкапсуляции и рассеиваем свойства класса по всему месту.

Ответ 6

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

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

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

Ответ 7

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

Ответ 8

Является ли метод тем, что делает объект, или что-то сделанное с ним? Или это совсем другое понятие?

Позвольте мне сначала прояснить что-то о классе и объектах. Class обычно используются для обозначения конкретной категории. Как

  • Автомобили не Ferrari, или Porsche
  • Фрукты не банан, а Apple

Итак, это Ferrari, которая управляется, и банан, который съеден. Не их класс

Его всегда объект, который имеет свойства и имеет поведение.

Даже специально для вашего случая.

borrow() метод - действие/поведение, выполняемое объектом person объекта book, записи которого хранятся другим объектом самого library system.

Хороший способ представить это в OO для меня будет похож на

libray.borrow(new book('book title'), new person('starx'));

Просто для удовольствия, Что вы думаете об этом

person starx = new person('starx');
book title1 = new book('title1');
library libraryname = new library('libraryname');
libraryname.addBook(title1);

if(starx.request(title1, libraryname)) {
     starx.take(library.lend(title1, starx));
}

Ответ 9

Я думаю, это может пойти в любом случае. Для этого нет жесткого и быстрого правила. Идея - это логические функции, которые имеют смысл. Для меня Patron#borrow(BookCopy) имеет тот же смысл, что и BookCopy#borrow(Patron). Или у вас может быть класс LibManager.borrow(BookCopy, Patron).

Ответ 10

Твой инструктор прав. Ну, на самом деле, он неправ. Я не знаю.

Моя точка зрения заключается в том, что для таких вопросов часто нет твердых общих ответов так или иначе. Это в значительной степени сводится к тому, что лучше всего работает в вашем конкретном случае. Идите с помощью всего простого кода - это будет проще всего поддерживать. И, "проще всего закодировать", я предлагаю также учитывать предполагаемых пользователей классов (помимо только классов Library, Copy и Person).

Ответ 11

Я думал о том, что сегодня. Я пришел к такому выводу:

Какой смысл имеет смысл в соответствующем контексте.