IMHO, one of the best books on modeling never uses the words, "object-oriented" or "UML" or even "inheritance" (at least that I can remember). It was written by Gerald Weinberg and originally published in 1975. Just recently, the "Silver Anniversary Edition" came out. The book is titled, "An Introduction to General Systems Thinking." It was introduced to me in the mid-1990's by another "modeler" that I respect, J. Patrick Thompson who worked for Microsoft (until about a year ago) on various different abstractions.
Some enginees think that the book is too philosophical and high-level. But, I hold a different opinion. It is a book about thinking and analyzing a "system" of interacting entities. What should be paid attention to? What should be ignored? Can you abstract and simplify? What looks like something that you have seen before (and therefore, may have some observations to bring to the table)?
The process of defining a model starts with examining, abstracting and refining the set of “things” that exist in and/or influence the environment being examined. (Models should never start with the encoding, although that is where they inevitably end, in order to be formalized.) So, to create a model is first to determine the “entities” in the environment (the essence of the “things” in the space being examined). This determination does not reflect all the idiosyncrasies of the environment – but abstracts the essence of the things, in order to better understand and work with them. In fact, it may be necessary to abstract at multiple levels in order to address the environment adequately – for example, providing a view of the “computer” as a single entity, versus looking inside it for the details of all of its components.
Once the basic abstractions are defined, it is necessary to determine (and also abstract) the key relationships, interactions, and governing principles and rules/constraints of the “things”. Without the latter, our understanding of the environment is superficial and flawed.
If the model is correct and valid, then all the individual “things” of the environment can be reflected in “instances” of the model entities. All of the interchanges and interactions between the things can be abstracted into instances of the model relationships. And, everything is subject to the rules and constraints of the model. However, since we are defining abstractions, one should not assume that everything in the environment equates one-for-one with a type/class in the model. If you have accomplished this, then you have not abstracted anything! Go back to the beginning and start over!
Once you have the abstractions, then start formalizing them. I put some principles of a good model in my earlier post on "Programming versus Modeling".
Andrea