carfield.com.hkagile_2010_Cindy_McCracken.pdf2012-02-20T16:53:02Z2012-02-20T16:53:02Z<br/><br/><script type="text/javascript"><!--google_ad_client = "pub-9426659565807829";google_ad_slot = "9359905831";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>2012-02-20T16:53:02ZVernon_2011_1.pdf2011-12-29T15:35:42Z2011-12-29T15:35:42Z<br/><br/><script type="text/javascript"><!--google_ad_client = "pub-9426659565807829";google_ad_slot = "9359905831";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>2011-12-29T15:35:42ZStrangeLoop2011-DeanWampler-HeresiesandDogmasinSoftwareDevelopment.pdf2011-11-29T18:32:38Z2011-11-29T18:32:38Z<br/><br/><script type="text/javascript"><!--google_ad_client = "pub-9426659565807829";google_ad_slot = "9359905831";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>2011-11-29T18:32:38ZCheatsheet-Performance-Principles-Patterns-and-Anti-Patterns.pdf2011-10-21T16:32:50Z2011-10-21T16:32:50Z<br/><br/><script type="text/javascript"><!--google_ad_client = "pub-9426659565807829";google_ad_slot = "9359905831";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>2011-10-21T16:32:50Z02-Code-Quality.pdf2011-07-24T16:08:36Z2011-07-24T16:08:36Z<br/><br/><script type="text/javascript"><!--google_ad_client = "pub-9426659565807829";google_ad_slot = "9359905831";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>2011-07-24T16:08:36ZObject-Oriented.png2011-07-24T14:36:08Z2011-07-24T14:36:08Z<br/><img src="/document/software+design/Object-Oriented.png" id="main_img" alt="Object-Oriented.png"/><br/><script type="text/javascript"><!--google_ad_client = "pub-9426659565807829";google_ad_slot = "9359905831";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>2011-07-24T14:36:08Zpractical-file-system-design.pdf2011-06-30T17:02:38Z2011-06-30T17:02:38Z<br/><br/><script type="text/javascript"><!--google_ad_client = "pub-9426659565807829";google_ad_slot = "9359905831";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>2011-06-30T17:02:38Z_atlantic_monthly-broken_windows.pdf2011-03-23T15:58:22Z2011-03-23T15:58:22Z<br/><br/><script type="text/javascript"><!--google_ad_client = "pub-9426659565807829";google_ad_slot = "9359905831";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>2011-03-23T15:58:22ZtestBus.pdf2010-01-12T17:28:40Z2010-01-12T17:28:40Z<br/><br/><script type="text/javascript"><!--google_ad_client = "pub-9426659565807829";google_ad_slot = "9359905831";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>2010-01-12T17:28:40Zsaga.pdf2009-07-10T15:08:04Z2009-07-10T15:08:04Z<br/><br/><script type="text/javascript"><!--google_ad_client = "pub-9426659565807829";google_ad_slot = "9359905831";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>2009-07-10T15:08:04ZEvolving Frameworks_ A Pattern Language.pdf2009-04-18T19:10:26Z2009-04-18T19:10:26Z<br/><br/><script type="text/javascript"><!--google_ad_client = "pub-9426659565807829";google_ad_slot = "9359905831";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>2009-04-18T19:10:26Zspec.pdf2008-09-18T16:54:56Z2008-09-18T16:54:56Z<br/><br/><script type="text/javascript"><!--google_ad_client = "pub-9426659565807829";google_ad_slot = "9359905831";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>2008-09-18T16:54:56ZEverything.You.Know.is.Wrong.pdf2008-09-17T15:08:22Z2008-09-17T15:08:22Z<br/><br/><script type="text/javascript"><!--google_ad_client = "pub-9426659565807829";google_ad_slot = "9359905831";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>2008-09-17T15:08:22ZREADME.txt2008-03-17T17:25:16Z2008-03-17T17:25:16Z<br/>Implementations of GoF Design Patterns in Java and AspectJ<br/>Code base documentation<br/><br/><br/>Overview <br/>========<br/><br/>The goal was to provide parallel implementations in AspectJ and Java that <br/>allow for direct comparisons. It has to be noted that most patterns offer <br/>variability in the implementation approach. We choose the one that appeared <br/>to be the most general. Sometimes, the AspectJ version implements a slightly <br/>different (or additional) case(s). This is because AJ sometimes <br/>allows for additional functionality. Please refer to the web page for a <br/>detailed description of this work.<br/><br/>Example Setup <br/>=============<br/><br/>All pattern examples have a class called Main. This class is the test driver <br/>for the particular example. The Main classes are extensively documented using <br/>ajdoc, usually describing the experimental setup and the assignment of roles <br/>to participants. In most cases, the differences between Java and AspectJ <br/>implementations are also mentioned.<br/><br/>Documentation (ajdoc)<br/>=====================<br/><br/>It is possible to generate the ajdoc documentation for either all examples, <br/>for only the reusable library aspects, or for one particular example. Since <br/>ajdoc shows type names without their package (on the left hand side), multiple <br/>types with the same name (but residing in different packages) may be confused <br/>when the documentation for all examples is generated. <br/>==> Generate documentation for all examples: use the makeDocs batch file. <br/> (1) Change to the directory that you extracted the ZIP archive into. (2) <br/> Type "makeDocs" to generate the HTML documentation in the docs <br/> subdirectory.<br/>==> Generate Documentation for the reusable library aspects: use the provided <br/> makeLibraryDocs batch file. (1) Change to the directory that you extracted <br/> the downloaded ZIP file into. (2) Type "makeLibraryDocs" to generate the <br/> HTML documentation in the docs subdirectory.<br/>==> Generate docs for a single example: use the makeSingleExampleDocs batch <br/> file. (1) Change to the directory that you extracted the downloaded ZIP <br/> file into. (2) Call the batch file. It needs two arguments: the name of <br/> the pattern and the language used. For example, type: <br/> "makeSingleExampleDocs singleton aspectj" or type: <br/> "makeSingleExampleDocs templateMethod java".<br/>Within the ajdoc documentation, we tried to separate type names from our <br/>examples and role names (as presented in GoF). We show roles names in italics <br/>and actual type names in code font. This is reflected in the ajdoc <br/>documentation.<br/><br/>Questions, feedback, suggestions, etc.<br/>The AODP web page is <a href="http://www.cs.ubc.ca/labs/spl/aodp.html">http://www.cs.ubc.ca/labs/spl/aodp.html</a> <br/>Please send all questions, feedback, and suggestions to Jan Hannemann <br/>(jan@cs.ubc.ca). We are very much interested in improving our code. <br/>Please do not hesitate to drop us a line.<br/><br/><br/>Appendix<br/>========<br/><br/>This appendix outlines how to compile and run the examples provided, and how <br/>to generate ajdoc documentation. A number of DOS batch files exist that <br/>automate these tasks somewhat. Note that they only work in Windows <br/>environments. The following is a list of tasks and a description of what <br/>commands accomplish them. For compiling, running and generating documentation,<br/>two options are given. The first one is using a provided script; the second is <br/>the standard command-line option (longer, but will work on all operation <br/>systems).<br/><br/>Set up your system:<br/>1. Install Java and AspectJ<br/>2. Make sure your CLASSPATH contains the current directory (denoted by a <br/> period), e.g. CLASSPATH=.;C:\...<br/>3. Extract the ZIP file into a directory of your choice <br/>4. Change to that directory<br/><br/>Compile Java and AspectJ versions of a design pattern example (e.g. observer).<br/>Choose one:<br/>� makePattern observer <br/>� ajc @examples\observer\files.lst<br/><br/>Run a compiled example (e.g. observer). Choose one:<br/>� testPattern observer (this runs both Java and AspectJ versions)<br/>� java examples.observer.java.Main (for the Java version), <br/>java examples.observer.java.Main (for the AspectJ version)<br/><br/>Generate documentation for all examples. Choose one:<br/>� makeDocs<br/>� ajdoc -private -d docs @allPatterns.lst<br/><br/>Generate documentation for the library aspects. Choose one:<br/>� makeLibraryDocs<br/>� ajdoc -private -d docs ca.ubc.cs.spl.pattern.library<br/><br/>Generate documentation for a single example (e.g. the AspectJ version of the <br/>observer example). Choose one:<br/>� makeSingleExampleDocs observer aspectj<br/>� ajdoc -private -d docs examples.observer.aspectj<br/><br/>View the generated documentation:<br/>� Open the file index.html (located in the docs/ subdirectory) with your <br/> favorite browser.<br/><br/><script type="text/javascript"><!--google_ad_client = "pub-9426659565807829";google_ad_slot = "9359905831";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>2008-03-17T17:25:16ZExampleOfGoodAPI.pdf2007-02-26T07:12:12Z2007-02-26T07:12:12Z<br/><br/><script type="text/javascript"><!--google_ad_client = "pub-9426659565807829";google_ad_slot = "9359905831";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>2007-02-26T07:12:12ZHowToDesignGoodAPI.pdf2007-02-26T07:10:52Z2007-02-26T07:10:52Z<br/><br/><script type="text/javascript"><!--google_ad_client = "pub-9426659565807829";google_ad_slot = "9359905831";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>2007-02-26T07:10:52Zdddquickly.pdf2006-12-18T03:15:44Z2006-12-18T03:15:44Z<br/><br/><script type="text/javascript"><!--google_ad_client = "pub-9426659565807829";google_ad_slot = "9359905831";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>2006-12-18T03:15:44ZEvent-driven Architectures.pdf2006-06-13T15:09:58Z2006-06-13T15:09:58Z<br/><br/><script type="text/javascript"><!--google_ad_client = "pub-9426659565807829";google_ad_slot = "9359905831";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>2006-06-13T15:09:58ZAdvancedPrinciplesOfClassDesign.ppt2006-03-21T10:27:32Z2006-03-21T10:27:32Z<br/><br/><script type="text/javascript"><!--google_ad_client = "pub-9426659565807829";google_ad_slot = "9359905831";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>2006-03-21T10:27:32Zshort present of how to make good API design.pdf2006-03-21T05:06:12Z2006-03-21T05:06:12Z<br/><br/><script type="text/javascript"><!--google_ad_client = "pub-9426659565807829";google_ad_slot = "9359905831";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>2006-03-21T05:06:12Zpattern examples.pdf2004-07-07T16:00:00Z2004-07-07T16:00:00Z<br/><br/><script type="text/javascript"><!--google_ad_client = "pub-9426659565807829";google_ad_slot = "9359905831";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>2004-07-07T16:00:00Zarchitect comment pattern.txt2004-06-08T16:00:00Z2004-06-08T16:00:00Z<br/>---------- Forwarded message ----------<br/>Date: Thu, 29 Aug 2002 17:16:33 +0200<br/>From: John Favaro <jfavaro@tin.it><br/>Reply-To: extremeprogramming@yahoogroups.com<br/>To: Yahoo XP Group <extremeprogramming@yahoogroups.com><br/>Subject: [XP] An architect's comments on patterns<br/><br/>In a recent thread I passed on some comments from my brother, who is an<br/>architect, on the "design-build" paradigm. I had asked him what he knew<br/>about it, since there was interest in the software engineering community as<br/>an analogy to optional scope contracts; and I was interested in hearing at<br/>least one architect's point of view.<br/><br/>The resulting discussion was interesting enough that I decided What The Heck<br/>Let's Go All The Way and I asked my brother another question:<br/><br/>"What do you know about Christopher Alexander? His concept of patterns has<br/>generated a great deal of interest in the software engineering world."<br/><br/>Here is his response:<br/><br/>"He was a kind of guru in the 60's and 70's.<br/><br/>"the 'patterns' refers essentially to 'tradition' ; his basic point being<br/>that over 5,000 years immutable patterns of building and architecture emerge<br/>that we can rely on when taking on a building design; (for example, if you<br/>look at good rooms in domestic settings the best ones always seem to have<br/>windows on two sides, preferably opposite sides) He came up with 'patterns'<br/>instead of 'tradition' because it was Berkeley in the sixties when tradition<br/>was seen as oppressive, euro-centric and 'irrelevant'. He wanted to<br/>catalogue all the patterns of architecture in the history of the world (all<br/>over the world, not just Europe of course) in the belief that there would be<br/>a scientific way to get to good design--therefore avoiding the role of<br/>culture (because culture requires values and judgment and whose culture are<br/>we talking about anyway?) Of course it didn't work because architecture is<br/>an art not a science. And his concept of patterns is ten times more<br/>oppressive than the concept of the context of tradition as the fertile<br/>ground within which innovation thrives (innovation is all about finding the<br/>exception to the rule that changes the way we look at the rules, and<br/>sometimes even the rules themselves). The buildings he actually produced<br/>(not very many, small residences) ended up being ultra-conservative (very<br/>eurocentric, in fact, like little Austrian cottages) and not very<br/>remarkable.<br/><br/>"computer science is a science but I have a feeling that computer<br/>applications are as much an art as a science, since they're about tailoring<br/>to specific needs, making choices and judgments, relating choices to a set<br/>of values on behalf of the client, etc.<br/><br/>"that's why the design-build analogy is big trouble because the intent is to<br/>cut the 'artist' out of the equation--let the accountants drive the choices,<br/>after all it's all cut and dry right?, it's all just science; that's what<br/>the HMO's have done to doctors and medicine; our field went through it after<br/>WWII--you're next.<br/><br/>"run for your life..."<br/><br/>(Yes, he can be a bit provocative and dramatic)<br/><br/>In a second message he added this:<br/><br/>"well, the solution is to train the computer consultants to be responsible<br/>about budget and schedule--that time and money are as potent in creative<br/>possibility as anything else; the solution is not to cut them out of the<br/>picture altogether; that just leads to self-fulfilling ends--assume the<br/>consultant is only interested in design, let him focus on that in the vacuum<br/>of budget and schedule and 'we'll handle that part (even though we don't<br/>know what the hell he's talking about),' thus setting up a relationship of<br/>conflict and misunderstanding from the beginning and encouraging the<br/>designer to be irresponsible and narrowly focused;<br/><br/>"you treat people like children, they're going to act like children;"<br/><br/>Since I saw it first, I guess I get to make the first comments :-)<br/><br/>- after all the opinions expressed by us software guys about the<br/>architecture field, it's kind of funny to see an architect commenting on OUR<br/>field.<br/><br/>- regarding his opinion on Alexander's work ... well, it certainly made for<br/>interesting reading. Whether his opinion is universally shared in the world<br/>of architecture I don't know. One possibility that occurs to me is that my<br/>brother's goals for a successful building might be different from Alexander'<br/>s. What he did seem to be implying, however, is that Alexander ultimately<br/>did not have a lasting influence in the world of architecture. Again, I don'<br/>t know how true that is.<br/><br/>- I did find interesting his insistence on measuring Alexander's ideas by<br/>the buildings that were actually built with them. That meshes well with the<br/>centricity of code artifacts in XP, as the principal measure of results.<br/><br/>- regarding his characterization of the nature of computer applications, I<br/>thought he did pretty well, actually.<br/><br/>- when he starts talking about design-build again, I think this is once more<br/>where the difference between our contexts comes out. As Dan Palanza and<br/>others explained in the earlier thread, XP in particular is doing a lot to<br/>eliminate the antagonistic relationship between design and build in our<br/>context. Likewise the emphasis in agile development on accepted<br/>responsibility for time and budget considerations. The analogy to his<br/>warning about designers working in a vacuum of time and budget constraints<br/>in our situation might be that of *requirements analysts* working in vacuum<br/>of time and budget constraints, something Martin Fowler has also commented<br/>on.<br/><br/>Perhaps the overriding impression I get from all this is that, as others<br/>have written recently, maybe we shouldn't push quite as hard as we do to<br/>find perfect analogies between our world and the architectural world every<br/>single time. Patterns and design-build may not have been successful in the<br/>architectural world (if that's even true) -- but nobody doubts any more that<br/>patterns have been hugely successful in the software world; and it looks<br/>like the design-build paradigm as it is being tailored and applied in the<br/>software world (e.g. with optional scope contracts) will probably be<br/>successful, too. To each his own context.<br/><br/>John<br/><br/><script type="text/javascript"><!--google_ad_client = "pub-9426659565807829";google_ad_slot = "9359905831";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>2004-06-08T16:00:00Zreplace Conditional With Visitor.pdf2004-05-30T16:00:00Z2004-05-30T16:00:00Z<br/><br/><script type="text/javascript"><!--google_ad_client = "pub-9426659565807829";google_ad_slot = "9359905831";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>2004-05-30T16:00:00ZCommandProtocol.java2004-03-24T16:00:00Z2004-03-24T16:00:00Z<br/><TEXTAREA name="code" class="java" rows="16" cols="100">package ca.ubc.cs.spl.pattern.library;
/* -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* This file is part of the design patterns project at UBC
*
* The contents of this file are subject to the Mozilla Public License
* Version 1.1 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* either http://www.mozilla.org/MPL/ or http://aspectj.org/MPL/.
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is ca.ubc.cs.spl.patterns.
*
* Contributor(s):
*/
import java.util.WeakHashMap;
import java.util.Collection;
import java.util.LinkedList;
import java.util.Iterator;
import ca.ubc.cs.spl.pattern.library.Command;
import ca.ubc.cs.spl.pattern.library.CommandInvoker;
import ca.ubc.cs.spl.pattern.library.CommandReceiver;
// TODO: This implementation allows only for exactly one command per invoker.
// That can either stay this way or be replaced with composite (macro)
// commands, either with or without defined order. [Jan, Oct 29, 2002]
/**
* This is the abstract <i>Command</i> protocol.
*
* @author Jan Hannemann
* @author Gregor Kiczales
* @version 1.1, 10/29/02
*
* @see Command
*/
public abstract aspect CommandProtocol {
////////////////////////////////
// Invoker -> Command mapping //
////////////////////////////////
/**
* stores the mapping between CommandInvokers and Commands
*/
private WeakHashMap mappingInvokerToCommand = new WeakHashMap();
/**
* Sets a new command for an invoker
*
* @param invoker the object which will invoke the command
* @param command the command to be set
* @returns the former command
*/
public Object setCommand(CommandInvoker invoker, Command command) {
return mappingInvokerToCommand.put(invoker, command);
}
/**
* Removes a command from an invoker
*
* @param invoker the object which will no longer invoke the command
* @param command the command to be removed
* @returns the former command
*/
public Object removeCommand(CommandInvoker invoker) {
return setCommand(invoker, null);
}
/**
* Returns the command for an invoker
*
* @param invoker the object for which to return the command
* @returns the current command for the invoker
*/
public Command getCommand(CommandInvoker invoker) {
return (Command) mappingInvokerToCommand.get(invoker);
}
/////////////////////////////////
// Command -> Receiver mapping //
/////////////////////////////////
/**
* stores the mapping between Coammnds and Receivers
*/
private WeakHashMap mappingCommandToReceiver = new WeakHashMap();
/**
* Sets a new receiver for a command
*
* @param command the command to be set
* @param receiver the object to be manipulated by the command's
* execute() method
* @returns the former receiver
*/
public Object setReceiver(Command command, CommandReceiver receiver) {
return mappingCommandToReceiver.put(command, receiver);
}
/**
* Returns the receiver for a particular command
*
* @param invoker the object for which to return the command
* @returns the current command for the invoker
*/
public CommandReceiver getReceiver(Command command) {
return (CommandReceiver) mappingCommandToReceiver.get(command);
}
///////////////////////////////////////
// Command Execution via PC & advice //
///////////////////////////////////////
/**
* The join points after which to execute the command.
* This replaces the normally scattered myCommand.execute() calls.
*
* @param invoker the object invoking the command
*/
protected abstract pointcut commandTrigger(CommandInvoker invoker);
/**
* Calls <code>executeCommand()</code> when the command is triggered.
*
* @param invoker the object invoking the command
*/
after(CommandInvoker invoker): commandTrigger(invoker) {
Command command = getCommand(invoker);
if (command != null) {
CommandReceiver receiver = getReceiver(command);
command.executeCommand(receiver);
} else {
// Do nothing: This Invoker has no associated command
}
}
//////////////////////////////////
// setCommand() via PC & advice //
//////////////////////////////////
/**
* The join points after which to set a command for an invoker.
* This replaces the normally scattered myInvoker.add(Command) calls.
* The pointcut is provided in addition to the setCommand() method above,
* to allow all pattern code to be removed from concrete invokers.
*
* This PC is non-abstract, to make it optional for sub-aspcects to define
* it.
*
* @param invoker the invoker to attach the command to
* @param command the command to be attached to the invoker
*/
protected pointcut setCommandTrigger(CommandInvoker invoker, Command command);
/**
* Calls <code>addCommand()</code> when a command should be set.
*
* @param invoker the invoker to attach the command to
* @param command the command to be attached to the invoker
*/
after(CommandInvoker invoker, Command command): setCommandTrigger(invoker, command) { // TODO: is "before" a better choice?
if (invoker != null)
setCommand(invoker, command);
// TODO: throw exception in else case?
}
/////////////////////////////////////
// removeCommand() via PC & advice //
/////////////////////////////////////
/**
* The join points after which to remove a command from an invoker.
* This replaces the normally scattered myInvoker.remove(Command) calls.
* The pointcut is provided in addition to the removeCommand() method
* above, to allow all pattern code to be removed from concrete invokers.
*
* This PC is non-abstract, to make it optional for sub-aspcects to define
* it.
*
* @param invoker the invoker to remove the command from
*/
protected pointcut removeCommandTrigger(CommandInvoker invoker);
/**
* Calls <code>removeCommand()</code> when a command should be removed.
*
* @param invoker the invoker to remove the command from
*/
after(CommandInvoker invoker): removeCommandTrigger(invoker) { // TODO: is "before" a better choice?
if (invoker != null)
removeCommand(invoker);
// TODO: throw exception in else case?
}
////////////////////////////////////////////
// Command default method implementations //
////////////////////////////////////////////
/**
* Provides a deault implementation for the isExecutable method defined
* in the Command interface.
*
* @returns true (default implementation). Can be overwritten by concrete
* aspects or even concrete commands.
*/
public boolean ca.ubc.cs.spl.pattern.library.Command.isExecutable() {
return true;
}
////////////////////////////////////////////////////////////////
// Calling specialized execute() instead of generic execute() //
////////////////////////////////////////////////////////////////
public final void Command.execute() {} // this prevents anyone from implementing this method instead of the specialized version. Invokers can call it though
protected pointcut callGenericExecute(Command command):
( call(void Command+.execute())) && target(command);
after(Command command): callGenericExecute(command) { // TODO: around?
command.executeCommand(getReceiver(command));
}
}
</TEXTAREA><br><br/><script type="text/javascript"><!--google_ad_client = "pub-9426659565807829";google_ad_slot = "9359905831";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>2004-03-24T16:00:00ZCommandReceiver.java2004-03-24T16:00:00Z2004-03-24T16:00:00Z<br/><TEXTAREA name="code" class="java" rows="16" cols="100">package ca.ubc.cs.spl.pattern.library;
/* -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* This file is part of the design patterns project at UBC
*
* The contents of this file are subject to the Mozilla Public License
* Version 1.1 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* either http://www.mozilla.org/MPL/ or http://aspectj.org/MPL/.
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is ca.ubc.cs.spl.patterns.
*
* Contributor(s):
*/
/**
* This interface is used by extending aspects to say what types
* can be Receivers (i.e. manipulated by a command object receiving an
* executeCommand() call).
* This role is assigned by concrete sub-aspects of the <code>CommandProtocol
* </code> pattern aspect.
*
* @author Jan Hannemann
* @author Gregor Kiczales
* @version 1.1, 10/29/02
*
* @see CommandProtocol
*/
public interface CommandReceiver { } </TEXTAREA><br><br/><script type="text/javascript"><!--google_ad_client = "pub-9426659565807829";google_ad_slot = "9359905831";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>2004-03-24T16:00:00Z