Modifying the OO logic should have no impact on the DB. Modifying the
internal implementation of a SP should have no impact on the OO logic.
Maybe I am having a slow day, but I fail to see how changes in your
data model (which the DB represents) could have 0 impact on the OO
side, except if that changes is meant for another application/system
using the same data.

Sébastien

On Wed, Jul 23, 2008 at 4:57 PM, Peter Ritchie
<[EMAIL PROTECTED]> wrote:
> Yes, those are changes to the abstract entity, a two-sided change.  I'm
> not talking about those types of changes.  I'm talking about a one-sided
> change, a change that doesn't change the design of the abstract entity but
> changes the implementation of that entity on one side.
>
> How do you manage those one-sided changes (especially on the business
> logic side) if you're always generating code from DB schema?  I'm saying
> you're more tightly coupled if you're doing it that way; the
> implementation details of the business entities aren't free to change as
> needed.  (by implementation details I mean implementation that doesn't
> affect the design of the entities).  I agree, there's always coupling of
> every component in a system; that's not the coupling I was talking about--
> although I think it's obvious.
>
> On Wed, 23 Jul 2008 16:46:19 -0400, =?ISO-8859-1?Q?S=E9bastien_Lorion?=
> <[EMAIL PROTECTED]> wrote:
>
>>Whether you use Repository or Active Record, when a new *mandatory*
>>field is added to a table, that change usually ripples through the
>>whole project, from DAL to GUI. Removing a field or changing its type
>>would have the same impact.
>>
> >From my own experience, the only change with an effect that can be
>>limited, to the DAL or even only the DB, is adding a non mandatory
>>field or one where a default value makes sense.
>>
>>So talking about tight/loose coupling in the context of ORM has some
>>inherent inescapable limitations.
>>
>>Sébastien
>>
>>On Wed, Jul 23, 2008 at 12:04 PM, Peter Ritchie
>><[EMAIL PROTECTED]> wrote:
>>> What it sounds like to me is that you want to utilize agile software
>>> development techniques.  One tenet of this is to keep coupling very low.
>>> This follows the basic OO principle or single responsibility (SRP).
> Said
>>> in another way: a class should have only one reason to change.  If
> you're
>>> modeling a domain object and the implementation of the class must change
>>> when the DB changes, you're violating SRP and have tight-coupling.  Can
>>> software that works be written this way?  Of course (so, yes, this isn't
>>> really about capability, its about responsiveness to change).  But, it
>>> means changes to one aspect of the system ripple through the rest of the
>>> system.  This makes it difficult, costly, and time-consuming to make
>>> changes.
>>>
>>> The drawback of generating types from DB schema is your are effectively
>>> coupling modeled types to the DB.  Do all changes to DB schema ripple
>>> throughout the system?  Of course not; but when they do you can't make
>>> changes in a timely fashion.  Using OO principles and implementing the
>>> Repository pattern means most changes to the DB ripple only into the
>>> Repository implementations.
>>>
>>> I honestly don't think you can be agile in the long run with round-
>>> tripping code from DB schema.  It's one thing to start with DB schema,
>>> generate domain classes from them then they live on their own.  But,
>>> coupling all the domain types in your business layer directly to DB
> schema
>>> (by way of generating code from schema) means, at least some, changes to
>>> the DB have to much of an effect on too much of the system to make it
>>> easily maintainable.
>>>
>>> Do some projects work this way?  It depends on what you call "works".  I
>>> find in situations like that there's lots of push-back from the devs
> when
>>> the customer wants changes.  The devs know the changes will ripple
> through
>>> the entire system, be difficult to do, time-consuming, affect quality,
>>> etc.  If they do make the change, quality usually suffers and the
> customer
>>> isn't happy.  If they don't make the change then the customer doesn't
> have
>>> what they want, and they're not happy.  So, not being agile can affect
>>> capability.
>>>
>>> On Wed, 23 Jul 2008 14:02:13 +0300, Seref Arikan
>>> <[EMAIL PROTECTED]> wrote:
>>>
>>>>Ah, you are definitely a good choice for discussing the subject :)
>>>>
>>>>Ok. I agree with you to  a degree that I will not use inline responses,
>>> but
>>>>I'll rather try to make my questions more specific.
>>>>
>>>>Many of the advantages I'm trying to preserve by modelling using design
>>>>patterns and common OO concepts, are about "coding". More maintainable
>>> code
>>>>and more efficient changes to code (in terms of man hours) is my primary
>>>>point which is in favor of OO approach.
>>>>
>>>>This does not mean that you can't use DB concepts instead of using OO
>>>>concepts in modelling a domain. After spending about 8 years writing
> code
>>>>around and inside some very DB oriented apps, you learn to respect the
>>>>outcomes of this approach.
>>>>
>>>>I'm just saying that, by using DB concepts (types, relations) as the
>>> primary
>>>>modeling approach, and generating OO code from this model, we loose some
>>> of
>>>>the benefits of OO design. However, it is my opinion that this loss is
> not
>>>>about the actual capability of the software, it is mostly about the
>>>>efficiency of making changes to code, and up to a threshold value (very
>>> hard
>>>>to determine), this is acceptable.
>>>>
>>>>My request for comments is about the following scenario. By adopting OO
>>>>based design for domain, you can choose to completely ignore the
>>> requirement
>>>>for persistence, accept it as a service actually, and use all the things
>>>>like inheritence, interface based design, particular patterns etc..
>>>>
>>>>After you've done this, you have a set of classes, and you actually have
>>> two
>>>>choices.
>>>>
>>>>1) you can now forget about all these classes, and design a db schema
>>> based
>>>>model for the domain, as if you are doing the DB oriented modelling.
> After
>>>>this you generate OO reflections of your DB model by reverse enginering
>>> this
>>>>schema, and now you have two sets of "domain classes". One set is build
> on
>>>>OO concepts, and the other one is mappings to OO concepts from DB
>>> concepts.
>>>>A tool oriented summary is like this:
>>>>
>>>>[Classes generated from UML] <------->[connector
>>>>layer/service/class]<------------> [classes generated from DB
>>>>schema]<----------->[ORM services]<--------->[DB]
>>>>Here, there is a possibility of overlapping, like very similar classes
> in
>>>>both UML generated set and ORM generated set. But when inheritence and
>>> other
>>>>OO concepts are used heavily in OO based set, the distinction is usually
>>>>clear. Here, ORM based classes become kinda DTOs for DAOs, where DAO
>>> pattern
>>>>is encapsulated in connector layer.
>>>>Do you think the architecture above is overkill? Do you think that
> instead
>>>>of modelling DB by looking at the domain, we can model it as using the
>>> class
>>>>designs as inputs? I am trying to see if I can justify the appoarch
>>> above, I
>>>>guess the only way to do that is to give it a try in a moderate sized
>>>>project, which I have at hand at the moment, but still your opinions
> would
>>>>be quite valuable.
>>>>All the best
>>>>Seref
>>>>On Tue, Jul 22, 2008 at 3:48 PM, Frans Bouma <[EMAIL PROTECTED]> wrote:
>>>>
>>>>> Hi Seref,
>>>>>
>>>>> > I've just started a small web app, and I am using an ORM product for
>>> DB
>>>>> > access, which is what I have been doing for the last 5 years. In the
>>>>> > beginning I had my own solution, but after leaving the company I
>>> wrote it
>>>>> > for,  I did not take the code with me, and great products emerged
> for
>>>>> .NET
>>>>> > like llblgen.
>>>>>
>>>>>        :)
>>>>>
>>>>> > The thing is, for a small project, it is almost inevitable for a
>>>>> developer
>>>>> > to quickly create a db schema, generate sql statements from the db
>>> design
>>>>> > tool, and create the db, which if followed by reverse engineering
> the
>>> db
>>>>> > with orm tools, and bind it to UI. It is the kind of thing that I've
>>> done
>>>>> > maybe a hundred times or more.
>>>>>
>>>>>         Not only in small projects. Often a team contains one or more
> DB
>>>>> architects who are in charge of designing and maintaining the db
>>> schemas.
>>>>>
>>>>> > The thing is, when I start with use cases, and a domain model that
>>> does
>>>>> not
>>>>> > include any concerns for persistence, the results are different. The
>>> uml
>>>>> > diagram I'm looking at uses inheritence, design patterns etc, and if
>>> you
>>>>> do
>>>>> > not think about  persistence, the look of the code that uses this
>>> model
>>>>> is
>>>>> > quite clean. It is more maintainable too.
>>>>>
>>>>>         true, from a code perspective.
>>>>>
>>>>>        Though, one thing has to be realized: if you design a class
>>>>> hierarchy
>>>>> like Person <- Customer, Person <- Employee etc., these types didn't
>>> fall
>>>>> out
>>>>> of the sky: they're physical definitions of abstract entity types,
>>>>> projected
>>>>> onto program code.
>>>>>
>>>>>        This means that it doesn't matter if you write a person and
>>> customer
>>>>> class or that you create a person and customer table: both are
>>> projections
>>>>> of
>>>>> the same (!) abstract entity. The thing is: an abstract entity is a
>>>>> definition
>>>>> of something which is recognized in reality. How you create your code
> to
>>>>> deal
>>>>> with this definition is up to you, however it's wrong to ignore the
> fact
>>>>> that
>>>>> the entity is simply something that is recognized in reality, so
>>> modelling
>>>>> an
>>>>> entity model is really just modelling what's already there: reality
>>>>> contains
>>>>> these entities already.
>>>>>
>>>>>        If a class diagram is created which contains different types
> than
>>>>> the
>>>>> ones recognized in reality, it simply means a conversion has to take
>>> place.
>>>>> Too many times developers assume that this conversion takes place in
> an
>>> O/R
>>>>> mapper layer, but that's a mistake: the conversion has to take place
>>> inside
>>>>> the code: the conversions I'm talking about are actually projections:
>>> from
>>>>> one
>>>>> domain to the other. If the conversion doesn't take place, you can't
>>> talk
>>>>> about 'customer' in the context of the program and if the conversion
>>> isn't
>>>>> recognized as something required, one also can't talk about 'customer'
>>> in
>>>>> the
>>>>> context of reality. And especially that second part is where things go
>>>>> horribly wrong in a lot of application which consume databases.
>>>>>
>>>>> > Now this is a clash between two different approaches, where domain
>>> info
>>>>> is
>>>>> > modelled first in db or in a domain model. The question is, what is
>>> the
>>>>> best
>>>>> > way to merge these approaches? I am really happy about using
> benefits
>>> of
>>>>> OO
>>>>> > in the domain model, but at the end I find myself writing
> a "manager"
>>>>> layer
>>>>> > which connects domain classes to orm generated classes.
>>>>>
>>>>>         As long as your application logic deals with entity types
> which
>>> are
>>>>> simply a physical representation of the abstract definition, you can
>>> make
>>>>> decisions based on these entities with rules as recognized in reality,
>>> e.g.
>>>>> based on interviews with the client, research of the organization the
>>>>> application is for etc.
>>>>>
>>>>>        The advantage of having entity types which represent elements
>>>>> recognized in reality is that your code mimics that of what should be
>>> done
>>>>> in
>>>>> reality / is done in reality as well. I.o.w. you can reason about what
>>> the
>>>>> logic should be done by simply looking at reality and how processes
>>> work,
>>>>> should work, how information streams run, what information is
> available
>>>>> etc.
>>>>>
>>>>>        Nowadays this is called 'domain oriented', in earlier days
> there
>>>>> were
>>>>> different terms, but they all come done to the simple fact that one
>>> should
>>>>> recognize what reality contains about the subject at hand and use that
>>>>> information as the base of the software to build.
>>>>>
>>>>>        Never ever fall into the trap that the class model is the
>>>>> representation of a) reality and b) what should be done to make the
>>>>> software
>>>>> behave in reality as required.
>>>>>
>>>>> > I am not sure if ORM should be responsible for more than eliminating
>>> the
>>>>> gap
>>>>> > between relational paradigm and OO paradigm, and you see all these
>>>>> resources
>>>>> > referring to ORM classes as domain classes. Check out any OO design
>>>>> resource
>>>>> > or course, and you'll see that the modelling of a domain is rarely
>>>>> performed
>>>>> > in DB world, where schemas and allowed db types are your building
>>> tools.
>>>>> > Eclipse Modelling Framework seems to have a binding to Hibernate for
>>>>> > example, which is a clear indication of seperating domain model from
>>> ORM
>>>>> > classes, and I think I am in favor of this approach, for it allows
> me
>>> to
>>>>> do
>>>>> > the design based on OO approach, and it also gives the benefit of
>>> being
>>>>> able
>>>>> > to isolate myself from sql.
>>>>>
>>>>>         Though, it's nothing more than dealing with the overhead of
>>>>> text-based
>>>>> code which is a projection of the functionality required: if the
>>> paradigm
>>>>> of
>>>>> the code changes, if the language changes (e.g. from C# to haskell),
> the
>>>>> real
>>>>> program, the solutions to the problems recognized, the functionality
>>>>> required,
>>>>> the entities recognized in reality which are the ones to deal with
>>> aren't
>>>>> changing one bit.
>>>>>
>>>>>        Thinking in C# statements too often makes people think that
> what
>>>>> they're typing in is the solution, is the functionality, are the
>>>>> datastructures required, but they're projections of the solution,
>>>>> functionality and datastructures required. Because they're
> projections,
>>>>> your
>>>>> main focus first should be on the source of these projections, which
> is
>>>>> what
>>>>> we're today call the domain model, entity models etc.
>>>>>
>>>>>        And these have little to do with code, class models and the
> like.
>>>>>
>>>>> > On the other hand, ORM based approach simply works! I think I'm more
>>>>> > inclined to accept ORM (generated) classes as domain classes when
> I'm
>>>>> under
>>>>> > time pressure and the app is small, and writing down the connecting
>>> layer
>>>>> > between domain and orm layers when I have more time and the project
> is
>>>>> > larger.
>>>>> > I'd love to hear what you think about this. How do you draw the
> line?
>>>>> Which
>>>>> > approach is common in your shop?
>>>>>
>>>>>         I wrote a couple of articles about this subject, one is in
>>> Jimmy's
>>>>> book: 'The datamodel is the domain model' (I always love the reactions
>>> of
>>>>> code-junkies when they see the title ;)) available here:
>>>>>
>>>>> http://weblogs.asp.net/fbouma/archive/2006/08/23/Essay_3A00_-The-
>>> Database-Mode
>>>>> l-is-the-Domain-
>>> Model.aspx<http://weblogs.asp.net/fbouma/archive/2006/08/23/Essay_3A00_-
>>> The-Database-Model-is-the-Domain-Model.aspx>
>>>>>        and I rehashed it abit in different wording here:
>>>>>
>>>>> http://weblogs.asp.net/fbouma/archive/2008/05/19/why-use-the-entity-
>>> framework-
>>>>> yeah-why-
>>> exactly.aspx<http://weblogs.asp.net/fbouma/archive/2008/05/19/why-use-
> the-
>>> entity-framework-yeah-why-exactly.aspx>
>>>>>
>>>>>        In v3 of LLBLGen Pro we'll do both approaches, model first
>>> (dbschema
>>>>> follows entity model) and dbschema first (entity model reverse
>>> engineered
>>>>> from
>>>>> dbschema), which both come down to simply build an entity model +
>>> mappings
>>>>> +
>>>>> dbschema model, and it doesn't really matter which side you started,
>>> you'll
>>>>> end up in that state anyway. Nice thing is that you can directly
>>>>> communicate
>>>>> with domain experts _and_ database schema experts at that level, as
> it's
>>>>> the
>>>>> abstraction level already defined a long time ago in for example
>>> NIAM/ORM
>>>>> (object role modelling ;)), Yourdon and later on in a set of different
>>>>> names
>>>>> by Evans.
>
> ===================================
> This list is hosted by DevelopMentor(R)  http://www.develop.com
>
> View archives and manage your subscription(s) at http://discuss.develop.com
>



-- 
Sébastien
www.sebastienlorion.com

===================================
This list is hosted by DevelopMentor®  http://www.develop.com

View archives and manage your subscription(s) at http://discuss.develop.com

Reply via email to