img - GitHub Pages
img - GitHub Pages
img - GitHub Pages
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
3.5. Implementations-Sicht 52<br />
157<br />
158 Community.find({ where: { name: communityData.name }})<br />
159 .success(function findResult(community) {<br />
160 // ... more callbacks (see cited file)<br />
161 })<br />
162 .error(function findError() {<br />
163 return res.send(500);<br />
164 });<br />
165 })<br />
166 .error(function getError() {<br />
167 return res.send(500);<br />
168 });<br />
169 });<br />
170 }<br />
Quelltext 3.8: Ausschnitt aus Community Controller mit Callback Hell [AJWf]<br />
Quelltext 3.8 zeigt einen Ausschnitt der createCommunity-Funktion. Es ist offensichtlich,<br />
dass dieser Quelltext aufgrund der Verschachtlung von Funktionen sehr schwer<br />
lesbar ist. Diese Situation wird treffend als “Callback hell” bezeichnet.<br />
Für ein Refactoring können folgende zwei Ansätze angewendet werden:<br />
• Funktional<br />
• Promises / Futures<br />
Funktional<br />
Der funktionale Ansatz versucht Callbacks in eigene Funktionen auszulagern und dabei<br />
Seiteneffekte zu vermeiden.<br />
Die Vermeidung von Seiteneffekten ist wichtig und wünschenswert, bedingt aber meist<br />
die Übergabe vieler einzelner Argumente beim Aufruf der ausgelagerten Funktion.<br />
Quelltext 3.9 zeigt einen Ausschnitt der überarbeiteten Version von Quelltext 3.8. Es<br />
wurde der funktionale Ansatz für das Refactoring gewählt.<br />
192 function createCommunity(success, error, data) {<br />
193 var // ...<br />
194 , forwardError = function forwardError(err) {<br />
195 // ...<br />
196 }<br />
197 , afterCommunitySearch = function afterCommunitySearch(community) {<br />
198 // ...<br />
199 communityDao.create(communityData)<br />
200 .success(afterCommunityCreate)<br />
201 .error(forwardError);<br />
202 }<br />
203 , afterCommunityCreate = function afterCommunityCreate(community) {<br />
204 // ...<br />
205 createUniqueSlug(db, community.name, community.id