OOP: Which class should own a method?
Question by Frungi
I’m having trouble understanding how classes relate to their methods. Is a method something that the object does, or something that’s done to it? Or is this a different concept entirely?
Specifically, in a library’s software system, should the borrow()
method belong to the class representing the library patron, or the class representing the item that the patron is borrowing? My intuition is that it should read like patron.borrow(copy)
, like English sentence structure, subject.verb(object)
; but my instructor says that’s Wrong, and I don’t understand why he would have borrow()
belong to the Copy
class (and he doesn’t really explain things too well). I’m not looking for justification, but can someone just explain the proper relationship?
Edit: This question was closed as “off topic”. I don’t understand. Are software design questions not appropriate for this site?
Answer by Konstantin Oznobihin
Some generic words first.
Software construction is not something which should be governed by English language rules or “beauty” or whatever, it’s engineering discipline. Think of whether your design solves the problem, whether it will be maintainable, whether it will be testable, whether it will be possible to parallelize development and so on. If you want something more formalized take a look at the “On the Criteria To Be Used in Decomposing Systems into Modules” by D. L. Parnas.
As for your library example. Imagine you have a Copy outside of library, shoult it have borrow
method then? How the borrowing is registered? Are you ok with either Copy or Patron classes responsible for data storage? It looks more appropriate to put borrow
into a Library class. Responsibilities will be clearly divided, you wouldn’t need to know much about borrowing to implement Copy and Patron and you wouldn’t need much details about them to implement Library.
Answer by Starx
Is a method something that the object does, or something that’s done to it? Or is this a different concept entirely?
Let me clear something about class and objects first. Class
are generally used to a denote particular category. Like
- Cars not Ferrari, or Porsche
- Fruits not Banana, or Apple
So, it’s Ferrari that is driven, and a banana that is eaten. Not their class
Its always an object that has properties and has behavior.
Even going to your case specifically.
borrow()
method is an action/behavior done by a object of a person
on an object of book
whose records is kept by another object of the library system
itself.
A good way to represent this in OO way for me would be like
libray.borrow(new book('book title'), new person('starx'));
Just for fun, What do you think about this
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));
}