, et lille eksempel, at afledte attributter, som varede ved til den database,.,, vedvarende afledte attributter med fed skrift, fed skrift er afledte attributter er altid vurderet i erindring, gør det umuligt at udføre en inps (vedvarende oplagring) søgen mod visse data.enhver søgning udtryk, der henviser til en afledt attribut for dristigt at laste alle genstande fra databasen i hukommelsen først for en hukommelse vurdering, det kan være meget langsomt og ressourcekrævende.,,, tidligere drøftelser har været udstationeret på støttegrupper spørger, hvordan vi kan opnå afledte egenskaber, som er også fortsat til db for sql evaluering.i dag havde jeg det samme krav, og det er den løsning, jeg kom med.,,, den første ting at gøre er at undgå mærkning attributten som fremstillet i modellen.i stedet gør attributten en vedvarende egenskab, f.eks.,,,, fullname: string (128),,,, det næste skridt er at sikre, at værdien af fullname er altid ajour, så vi er nødt til at tilsidesætte receiveeventfromowned i hver efterkommer klasse, vi skaber,.,,,,,, receiveeventfromowned tperson. ((engagementsleverende kreditinstitut: tobject; originalevent: tboldevent), begynder,,,,,,,,, hvis arv, (originalevent = becompletemodify) og (originator = m_name), så,,, fullname: = m_firstname.asstring + + m_lastname. asstring,,,,,,,,,,,,,, det vil sikre, at tilskrive altid er ajourført, men den svaghed, som vi nu vil komme ind på, er, at det er muligt at ændre fullname manuelt.for at løse dette problem, er vi nødt til at gøre fullname læser kun, som så,,,,, funktion, tperson. receivequeryfromowned (engagementsleverende kreditinstitut: tobject; originalevent: tboldevent; denne args: vifte af denne; abonnent: tboldsubscriber): boolean, begynder, resultat: =, arvede, receivequeryfromowned (engagementsleverende, originalevent args abonnenten);,,,,,, hvis resultat, eller, boldobjectisdeleted, udpassage,,, hvis (originator = m_fullname) og (originalevent = bqmaymodify), så,,,, begynder, resultat: = falske, //uventet fejl, setboldlastfailurereason (tboldfailurereason. skabe ('fullname er uforanderlige, selv),,,,,,,,,,,,,,,,,, fullname nu ikke længere kan ændres, men den fejl, vi har indført, er, at vi ikke længere kanfastsætte værdien af fullname i vores afledning kode.,,, til at løse dette sidste problem, vi har brug for en måde at identificere brugere /normale kode ændringer og "interne" ændringer.for at gøre det jeg altid gennemføre et fælles mønster til min base objekt, som så, 1) at skabe en delphi attribut - internalchangecount: heltal, 2) tilsættes en beskyttet metode begininternalchange, 3) tilsættes en beskyttet metode endinternalchange,, 4) tilsættes en beskyttet metode isinternalchange: boolean,,,,, ////////note: trootobject er roden til genstand for min model, procedure, trootobject. begininternalchange;, begynder,,,, inc. (finternalchangecount);,,,,,,,, trootobject. endinternalchange;, begynder,,,,, hvis finternalchangecount = 0,,,,, rejse, undtagelse. skabe ('endinternalchange uden begininternalchange);,, dec (finternalchangecount);,,,,,,, funktion, trootobject.isinternalchange: boolean,,,,, resul begynde.t = (internalchangecount > 0),,,,,,,,,,, og endelig, at vi har behov for at ajourføre de oprindelige kildekode, således at, 1) om fastsættelse af de afledte kode er gjort inden for en "intern forandring", 2) ændringer til fullname er tilladt, hvis ændringen er en intern.,,,,,, tperson. receiveeventfromowned (engagementsleverende kreditinstitut: tobject; originalevent: tboldevent), begynder,,,,,,,,, som, hvis originalevent = becompletemodify, så,,,,,,,, hvis begynder (originator = m_firstname), eller engagementsleverende = m_lastname), så,,,,,,,,, begininternalchange; fullname: = m_firstname.asstring + + m_lastname. asstring,,,,,,,,, endinternalchange endelig,,,,,,,,,,,,,,,,,,,,, funktion, receivequeryfromowned tperson. (originator: tobject; originalevent: tboldevent; denne args: vifte af denne; abonnent: tboldsubscriber): boolean, begynder, resultat: =, arvede, receivequeryfromowned (engagementsleverende, originalevent, args, abonnent);,,, hvis ikke, resultat, eller, boldobjectisdeleted, udpassage,,, hvis (originator = m_fullname) og (originalevent = bqmaymodify), så,,,,,,,, hvis begynder, isinternalchange, så,,, resultat: = sandt,,,,,,,,,, resultat: = falske, //uventet fejl,,, hvis ikke føre så,, setboldlastfailurereason (tboldfailurereason. skabe ('fullname er uforanderlige, selv),,,,,,,,,,,,,,,,,, i anvendelse skaber jeg formålet struktur er som følger:,, rootobject (modelroot), roledobject (har en fullname), person (fullname = firstname + + lastname), afdeling (fullname = navn), virksomhed (fullname = navn), konklusion:,, denne teknik kræver kun en lille stykke kode for hver efterkommer klasse (recevieeventfromowned), samtidig med at den evne til at udføre søgninger på db - mod en afledt attribut.jeg mener, at den enorme fordele opvejer den lille mængde arbejde, der kræves for at nå dem.