<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>http://95.179.246.60/mediawiki/index.php?action=history&amp;feed=atom&amp;title=The_Dependency_Mechanism_-_part_3</id>
	<title>The Dependency Mechanism - part 3 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="http://95.179.246.60/mediawiki/index.php?action=history&amp;feed=atom&amp;title=The_Dependency_Mechanism_-_part_3"/>
	<link rel="alternate" type="text/html" href="http://95.179.246.60/mediawiki/index.php?title=The_Dependency_Mechanism_-_part_3&amp;action=history"/>
	<updated>2026-05-08T12:47:38Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.17</generator>
	<entry>
		<id>http://95.179.246.60/mediawiki/index.php?title=The_Dependency_Mechanism_-_part_3&amp;diff=184&amp;oldid=prev</id>
		<title>Nmingott: imported material</title>
		<link rel="alternate" type="text/html" href="http://95.179.246.60/mediawiki/index.php?title=The_Dependency_Mechanism_-_part_3&amp;diff=184&amp;oldid=prev"/>
		<updated>2025-05-12T20:42:52Z</updated>

		<summary type="html">&lt;p&gt;imported material&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;* In Cuis the dependency is handled with the  Observer pattern&lt;br /&gt;
* In the observer pattern an object called &amp;#039;&amp;#039;&amp;#039;subject&amp;#039;&amp;#039;&amp;#039; maintains a list of &amp;#039;&amp;#039;&amp;#039;observers&amp;#039;&amp;#039;&amp;#039;. The &amp;#039;&amp;#039;&amp;#039;subject&amp;#039;&amp;#039;&amp;#039; notifies its &amp;#039;&amp;#039;&amp;#039;observers&amp;#039;&amp;#039;&amp;#039; when it changes.&lt;br /&gt;
* In Cuis the Parent-Dependent pattern is implemented with the Subject-Observer this way&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;Parent-Dependent&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;Subject-Observer&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|connection making. &amp;#039;&amp;#039;&amp;#039;objB&amp;#039;&amp;#039;&amp;#039; wants to be informed of changes in &amp;#039;&amp;#039;&amp;#039;objA&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
|&amp;lt;code&amp;gt;objA addDependent: objB&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;objA when: #changed send: #update to: objB&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;objA&amp;#039;&amp;#039;&amp;#039; tells the objects who are watching it that it changed state.&lt;br /&gt;
|&amp;lt;code&amp;gt;objA changed: #param&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;objA triggerEvent: #changed with: #param&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|when  &amp;#039;&amp;#039;&amp;#039;objA&amp;#039;&amp;#039;&amp;#039; state changes the message &amp;lt;code&amp;gt;update&amp;lt;/code&amp;gt; is sent to &amp;#039;&amp;#039;&amp;#039;objB&amp;#039;&amp;#039;&amp;#039; with a parameter.&lt;br /&gt;
|&amp;lt;code&amp;gt;objB update: #param&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;objB update: #param&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|we want &amp;#039;&amp;#039;&amp;#039;objB&amp;#039;&amp;#039;&amp;#039; to stop watching &amp;#039;&amp;#039;&amp;#039;objA&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|&amp;lt;code&amp;gt;objA removeDependent: objB&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;objA removeActionWithReceiver: objB forEvent: #changed&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* Observe that the parameter &amp;lt;code&amp;gt;#changed&amp;lt;/code&amp;gt; is used explicitly in Cuis to build Parent-Dependent pattern, but that is actually a free parameter in the Observer model.&lt;br /&gt;
* In Cuis6 &amp;#039;&amp;#039;&amp;#039;Model&amp;#039;&amp;#039;&amp;#039; is substituted by &amp;#039;&amp;#039;&amp;#039;ActiveModel&amp;#039;&amp;#039;&amp;#039;, if you look into the implementation of the Parent-Dependent pattern you will see that dependencies between objects go by default stored in class variable &amp;#039;&amp;#039;&amp;#039;ActionMaps&amp;#039;&amp;#039;&amp;#039; of &amp;#039;&amp;#039;&amp;#039;ActiveModel&amp;#039;&amp;#039;&amp;#039; . This instead of using class variable &amp;#039;&amp;#039;&amp;#039;DependentsFields&amp;#039;&amp;#039;&amp;#039; of class &amp;#039;&amp;#039;&amp;#039;Object&amp;#039;&amp;#039;&amp;#039;, as done in the classic implementation, for example in VisualWorks and Squeak.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Exercise&amp;#039;&amp;#039;&amp;#039;. Use &amp;lt;code&amp;gt;ActiveModel actionMaps&amp;lt;/code&amp;gt; to explore the &amp;#039;&amp;#039;&amp;#039;ActionMaps&amp;#039;&amp;#039;&amp;#039; class variable content.&lt;br /&gt;
* Mirroring our previous example in the Parent-Dependent model, we impolement of two simple classes (in the Subject-Observer model) &amp;#039;&amp;#039;&amp;#039;MyActiveNumber&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;MyObserverNumber&amp;#039;&amp;#039;&amp;#039; for objects &amp;#039;&amp;#039;&amp;#039;objA&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;objB&amp;#039;&amp;#039;&amp;#039;, where &amp;#039;&amp;#039;&amp;#039;objB&amp;#039;&amp;#039;&amp;#039; is observer for &amp;#039;&amp;#039;&amp;#039;objA&amp;#039;&amp;#039;&amp;#039;. We want to keep the dependency mechanism localized so &amp;#039;&amp;#039;&amp;#039;MyActiveNumber&amp;#039;&amp;#039;&amp;#039; will be subclass of &amp;#039;&amp;#039;&amp;#039;ActiveModel&amp;#039;&amp;#039;&amp;#039; (instead of &amp;#039;&amp;#039;&amp;#039;Object&amp;#039;&amp;#039;&amp;#039;). When &amp;#039;&amp;#039;&amp;#039;objA&amp;#039;&amp;#039;&amp;#039; changes we want &amp;#039;&amp;#039;&amp;#039;objB&amp;#039;&amp;#039;&amp;#039; to receive the message &amp;lt;code&amp;gt;update&amp;lt;/code&amp;gt;, we don&amp;#039;t want to pass any parameter, &amp;#039;&amp;#039;&amp;#039;objB&amp;#039;&amp;#039;&amp;#039; will ask what it need to &amp;#039;&amp;#039;&amp;#039;objA&amp;#039;&amp;#039;&amp;#039;. You can get the fileout here: MyActiveNumber.st and MyObserverNumber.st .&lt;br /&gt;
&lt;br /&gt;
 ActiveModel subclass: #MyActiveNumber&lt;br /&gt;
     instanceVariableNames: &amp;#039;value&amp;#039;&lt;br /&gt;
 &lt;br /&gt;
 MyActiveNumber &amp;gt;&amp;gt; initialize&lt;br /&gt;
     value := 0. &lt;br /&gt;
     ^ self &lt;br /&gt;
 &lt;br /&gt;
 MyActiveNumber &amp;gt;&amp;gt; value &lt;br /&gt;
         ^ value &lt;br /&gt;
 &lt;br /&gt;
 MyActiveNumber &amp;gt;&amp;gt; value: aNumber        &lt;br /&gt;
         value := aNumber&lt;br /&gt;
         self triggerEvent: #iChanged &lt;br /&gt;
 &lt;br /&gt;
 Object subclass: #MyObserverNumber&lt;br /&gt;
     instanceVariableNames: &amp;#039;value model&amp;#039;  &lt;br /&gt;
 &lt;br /&gt;
 MyObserverNumber class &amp;gt;&amp;gt; newWithModel: anObject&lt;br /&gt;
     ^ super new initializeWithModel: anObject&lt;br /&gt;
 &lt;br /&gt;
 MyObserverNumber &amp;gt;&amp;gt; initializeWithModel: anObject&lt;br /&gt;
     value := 0.&lt;br /&gt;
     model := anObject . &lt;br /&gt;
     model when: #iChanged send: #update  to: self .  &lt;br /&gt;
     ^ self     &lt;br /&gt;
 &lt;br /&gt;
 MyObserverNumber update&lt;br /&gt;
     |vPar vMe |&lt;br /&gt;
      vPar := model value. &lt;br /&gt;
      vMe := vPar * 2.&lt;br /&gt;
      value := vMe.&lt;br /&gt;
      Transcript show: (&amp;#039;my MODEL value is:{1} and mine is value:{2}&amp;#039; format: {vPar. vMe} ). &lt;br /&gt;
 &lt;br /&gt;
 MyObserverNumber value&lt;br /&gt;
          ^ value                                            &lt;br /&gt;
&lt;br /&gt;
* Then try everything works with a little interaction from the Workspace&lt;br /&gt;
&lt;br /&gt;
 objA := MyActiveNumber new. &lt;br /&gt;
 objB := MyObserverNumber newWithModel: objA. &lt;br /&gt;
 &lt;br /&gt;
 objA value .  &amp;quot;=&amp;gt; 0&amp;quot;&lt;br /&gt;
 objB value.   &amp;quot;=&amp;gt; 0&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 objA value: 10.  &lt;br /&gt;
 &lt;br /&gt;
 objB value. &amp;quot;=&amp;gt; 20&amp;quot; &lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Exercise&amp;#039;&amp;#039;&amp;#039;. explore &amp;#039;&amp;#039;&amp;#039;objA&amp;#039;&amp;#039;&amp;#039; and convince your self it contains the map toward object &amp;#039;&amp;#039;&amp;#039;objB&amp;#039;&amp;#039;&amp;#039;.&lt;/div&gt;</summary>
		<author><name>Nmingott</name></author>
	</entry>
</feed>