Supporting Software Development through Declaratively Codified Programming Patterns
|
|
|
- Terence Greene
- 9 years ago
- Views:
Transcription
1 Supporting Software Development through Declaratively Codified Programming Patterns Kim Mens, Isabel Michiels Roel Wuyts { kimmens Isabel.Michiels }@vub.ac.be [email protected] Programming Technology Lab Software Composition Group Department of Computer Science Institut für Informatik Vrije Universiteit Brussel, Belgium Universität Bern, Switzerland Abstract In current-day software development, programmers often use programming patterns to clarify their intents and to increase the understandability of their programs. Unfortunately, most software development environments do not adequately support the declaration and use of such patterns. To explicitly codify these patterns, we adopt a declarative meta-programming approach. In this approach, we reify the structure of an (object-oriented)program in terms of logic clauses. We declare programming patterns as logic rules on top of these clauses. By querying the logic system, these rules allow us to check, enforce and search for occurrences of patterns in the software. As such, the programming patterns become an active part of the development and maintenance environment. Keywords: programming patterns, logic programming, meta-programming, tool support 1 Introduction Contemporary software development practice regards software construction as an incremental and continuous process that involves large development teams. In such a context, it is crucial that the software is as readable as possible. One cannot afford that programmers have to wade through piles of documentation and code to understand the software or to discover the intents of the original programmers. Instead, they should spend their precious time to tackle the real problem (that is, the task of programming itself, i.e. conceptualizing, designing, implementing and maintenance [7]). By using commonly accepted programming (and design) patterns, it becomes much easier for programmers to communicate their intents [1]. A problem with adhoc patterns, however, is that they are not supported by the programming language nor by the development environment. For example, whether or not a certain programming pattern is consistently used throughout a program solely depends on the programmers discipline. By relieving the mind of all unnecessary work, a good notation sets it free to concentrate on more advanced problems, and in effect increases the mental power of the race. Alfred North Whitehead To allow programmers to gain maximum profit from the extra information that is encoded in patterns, there is a need for tools that support the use of such patterns. We envision the patterns as becoming an explicit and active part of the development environment. Some activities that such an environment should support are: checking whether a piece of source code matches a pattern; finding all pieces of code that match a pattern; searching for all occurrences of patterns that were used to program a piece of source code; detecting violations of the usage of a pattern; enforcing the consistent use of a pattern throughout a program; generating code that matches a pattern. This paper advocates the use of a declarative metalanguage for expressing and reasoning about programming patterns in object-oriented programs.
2 2 Declarative Meta-Programming Declarative meta-programming (DMP) is an instance of hybrid language symbiosis, merging a declarative language at meta-level with a standard (objectoriented) base language. Base-level programs are expressed in terms of facts and rules at the meta-level. Programming patterns are expressed as rules that reason about the clauses representing those base-level programs. By querying the logic system, the rules can be used to check, detect, search for occurrences of and even generate code fragments from programming patterns. Before discussing what the programming pattern rules look like, we first elaborate on the base and meta-language. As declarative meta-language, we use a Prologvariant. Logic programming has long been identified as very suited to meta-programming and language processing in general. Prolog s expressive power (e.g. unification and backtracking) and its capacity to support multi-way reasoning 1 are particularly attractive to reason about patterns. Although DMP can be applied to programs written in any programming language, in this paper we take the object-oriented language Smalltalk as base language. One reason for choosing Smalltalk for our experiments is that there exists a Smalltalk culture which makes that Smalltalk programmers use a lot of well-known patterns to express important intents [1, 3], but for which no explicit language constructs are available. 2.1 Setup A DMP environment consists of 4 main elements. In a logic language, we declare programming patterns as logic meta-programs that reason about programs written in an (object-oriented) base language. The logic meta-programs are stored in a logic repository. The base-level language constructs are stored in an implementation repository that can be accessed from within the logic language, by means of a meta-level interface. For the experiments in this paper, we used the logic language SOUL [8] to allow powerful logic reasoning about Smalltalk programs. SOUL was implemented in Smalltalk and contains a primitive construct, called Smalltalk term, for evaluating Smalltalk expressions as part of logic rules. This allows SOUL clauses to reason about Smalltalk source code by making direct meta-calls to the Smalltalk image. 1 A prototypical example is the append/3 predicate, which can be used to append two lists, check whether a list is the concatenation of two others, check for and generate prefixes and postfixes of a list, and so on. 2.2 The Representational Mapping The representational mapping defines the meta-level interface between the declarative meta-language and the object-oriented base language. For each baselanguage construct we want to reason about at metalevel,thereisalogicfactorrulewhichreifies that construct at meta-level. Figure 1 lists some of the predicates that constitute this representational mapping. 2 Reification is achieved by using SOUL s symbiosis with Smalltalk to access the Smalltalk image directly by executing a piece of Smalltalk code as part of a logic rule. E.g., the SOUL rules below reify the notion of classes : 3 Rule class(?class) if constant(?class), [Smalltalk includes:?class name]. Rule class(?class) if variable(?class), generate(?class, [Smalltalk allclasses]). The first rule declares what happens when the class predicate is called with a constant value. In that case, the special Smalltalk term [Smalltalk includes:?class name] checks whether the value represents an existing class in the Smalltalk image. Note that a Smalltalk term used in the position of a predication is required to return true or false. The second rule is applied when?class is variable. In that case, a primitive generate predicate is used to unify that variable (the first argument of the predicate) with each of the classes present in the Smalltalk image. This is done by executing the Smalltalk expression between square brackets, which is provided as second argument to the generate predicate. A Smalltalk expression used in a generate predicate is supposed to return a collection of results. Given these rules, the query Query class([array]) verifies whether Array is an existing class in the Smalltalk image, whereas the query Query class(?class) unifies?class with a class in the Smalltalk image. Note that a Smalltalk term used in the position of a logic term can return any value. 2 In this table, a variable?c represents a Smalltalk class,?m a method parse tree,?n a method name,?v an instance variable name,?p the name of a Smalltalk method protocol,?mc a Smalltalk meta-class,?stats a list of Smalltalk statements and?args a list of names of argument variables. 3 In SOUL, the keyword if separates the body from the head of a Rule ; logic variables start with question marks; a comma denotes logical conjunction; lists are delimited with <> and terms between square brackets represent Smalltalk expressions that may contain (bound) logic variables.
3 Predicate Meaning class(?c)?c is a class classimplementsmethod(?c,?n,?m) class?c implements method?m with name?n methodarguments(?m,?args) method?m has argument list?args methodclass(?m,?c) method?m belongs to class?c methodname(?m,?n) method?m has name?n methodstatements(?m,?stats) method?m has list of statements?stats in its body instvar(?c,?v) class?c has instance variable with name?v issentto(?c1,?c2,?n,?args) in class?c1 message?n with argument list?args is sent to receiver?c2 metaclass(?c,?mc) class?c has meta-class?mc methodinprotocol(?c,?p,?m) method?m of class?c belongs to method protocol?p subclass(?c1,?c2) class?c1 has subclass?c2 Figure 1. The representational mapping Other rules that reify Smalltalk language constructs aredefinedinasimilarway;see[5,9]formoreexamples. In the next section, we show how best practice patterns, design patterns and other programming patterns can be encoded in SOUL. 3 Codifying Programming Patterns Every programming language has its set of patterns that experienced programmers follow to produce more understandable code. They use such patterns to make clear their intents and to improve the overall readability of the software. Well-known kinds of such patterns are best practice patterns [1], design patterns [4], design heuristics [6], bad smells and refactoring patterns [2]. In this section, we illustrate some of these patterns and show how they can be codified in a DMP medium. 3.1 Best Practice Patterns Beck s Smalltalk best practice patterns capture commonly accepted programming conventions for Smalltalk [1]. They suggest how to choose clear names for objects, instance variables and methods, how to communicate the programmer s intents through code, how to write understandable methods, etc. As concrete examples we discuss the Getting Method and Constructor Method best practice patterns Getting Method One way to make the distinction between state and behavior more transparent is by hiding every access to the state of an object by a message send. This is the motivation behind the idea of accessing methods. An accessing method is responsible for getting or setting the value of an instance variable. All references to an instance variable should be made by calling these methods. Methods that get the value of a variable are Getting Methods; methods that set the value of a variable are Setting Methods. The Getting Method best practice pattern [1] states: Getting Method How do you provide access to an instance variable? Provide a method that returns the value of the variable. Give it the same name as the variable. One possible DMP implementation for representing the structure of a Getting Method is given below. It declares that the statement list of a Getting Method consists of a single statement, which merely returns the value of the instance variable?v: Fact gettingmethodstats(<return(variable(?v))>,?v). Note that the above fact expresses only the simplest form of a Getting Method. Other forms of Getting Methods can be codified by adding similar facts or rules. E.g., a Getting Method that uses lazy initialization has an extra statement to initialize the value of the variable the first time the variable is retrieved. Due to space limitations, we did not include these other forms here. The predicate gettingmethodstats only defines the statement list of a Getting Method. To check whether a method of a class is a Getting Method for some instance variable, we need to verify that the instance variable belongs to that class, that the method has the same name as the variable and that the method returns that particular instance variable. 4 4 The underscore symbol denotes a special variable of which the actual value is unimportant.
4 Rule gettingmethod(?class,?method,?instvar) if classimplementsmethod(?class,,?method), instvar(?class,?instvar), methodname(?method,?instvar), gettingmethodstats(?stats,?instvar), methodstatements(?method,?stats). This gettingmethod predicate states that?class has an instance variable?instvar and a Getting Method?Method that retrieves the value of that variable The Constructor Method The Constructor Method best practice pattern indicates how you best express the creation of a class instance [1]: The Constructor Method. How do you represent instance creation? Provide methods that create well-formed instances. Pass all required parameters to them. (Put Constructor Methods in a method protocol called instance creation.) The fact that all Constructor Methods are, by convention, put in the instance creation method protocol, makesitveryeasytocodifythispattern: Rule constructormethod(?class,?meth) if metaclass(?class,?meta), methodinprotocol(?meta,[# instance creation ],?Meth), returntype(?meth,?class). In Smalltalk, Constructor Methods are defined on meta-classes. Hence, we retrieve the meta-class and verify that?meth belongs to its instance creation method protocol. As an extra consistency check, we verify that the Constructor Method returns an instance of the correct type?class, by using an auxiliary predicate returntype(?meth,?class). This typing predicate returntype only guesses the type because Smalltalk is dynamically typed. To infer the type of the expression that is returned by the method, we look at all messages that are sent to that expression (in the context where it occurs). A class is a possible type for that expression if it understands all these messages (if not, a message not understood error may occur at run-time). 5 To facilitate reasoning about method statements, a?method is represented as a logic data-structure that corresponds to the method s parse tree, rather than as a string containing the original Smalltalk source code. The predicate methodstatements/2 matches a list of Smalltalk statements with the statements occurring in such a parse tree. 3.2 Design Patterns Whereas best practice patterns define programming conventions at the level of single classes, methods or instance variables, design patterns [4] have a more global scope and focus on typical class collaborations. As with best practice patterns, we codify the structure 6 of design patterns as logic meta-programs that reason about the structure of a base-level program. As an illustration, we codify the Visitor design pattern (structure). The general idea of the Visitor design pattern is to separate the structure of some elements from the operations that can be applied on these elements. This separation makes it easier and more cost-effective to add new operations, because the classes that describe the element structure do not need to be changed. Separating the nodes of a parse tree from the different operations performed on those nodes (such as generating code, pretty printing, optimizing) is the typical example where the Visitor design pattern offers a solution. As shown in Figure 2, in the Visitor design pattern structure there is a hierarchy describing the elements and there is a separate hierarchy implementing the operations. Assume that Element is the root class of a hierarchy on which the subclasses of the class Visitor define operations. Every Element class defines a method accept that takes a Visitor as argument and calls this visitor. This call is in general unique for that element. The Visitor hierarchy consists of the classes that define operations on the Element classes. They just need to implement the calls made by the different element classes. The rule describing the structure of the Visitor design pattern is fairly straightforward. First of all, it declares that?visitor is a class that implements the visit method?visitselector. In the same way, the class?el implements a?method called?acceptm. This method is responsible for calling the visitor?v with the actual visit operation?visitselector. Finally we need to verify that one of the arguments of this call is the receiver (denoted by self in Smalltalk) and that the passed visitor?v is an argument of the accept method: Rule visitor(?visitor,?el,?acceptm,?visitselector) if classimplementsmethod(?visitor,?visitselector, ), classimplementsmethod(?el,?acceptm,?meth), methodstatements(?meth, <return(send(?v,?visitselector,?visitargs))>), member(variable([# self ]),?VisitArgs), 6 Note that a design pattern captures more than only the structure of a class collaboration. It also has a motivation, intent, applicability, as well as relationships with other design patterns. In this paper, however, we only focus on the structure of design patterns.
5 Element accept: avisitor Visitor visitconcreteelement1: e visitconcreteelement2: e ConcreteElement1 accept: avisitor ConcreteElement2 accept: avisitor ConcreteVisitor1 visitconcreteelement1: e visitconcreteelement2: e Figure 2. Visitor Design Pattern Structure methodarguments(?meth,?accargs), member(?v,?accargs). 3.3 Other Programming Patterns Next to best practice patterns and design patterns, other patterns exist that check whether or not the software is well designed or well structured. Examples are Riel s design heuristics [6] and Beck and Fowler s bad smells [2]. As a typical example consider the following heuristic [6, Heuristics 5.6 and 5.7]: All abstract classes must be base classes and all base classes should be abstract classes. This heuristic can be codified as follows: Rule abstractclassheuristic() if forall(abstractclass(?class),baseclass(?class)), forall(baseclass(?class),abstractclass(?class)). where baseclass(?class) checks whether?class is a class from which another class inherits and abstract- Class(?Class) checks whether?class is abstract by verifying that it contains at least one abstract method. In Smalltalk, abstract methods can be recognized because they make a subclassresponsibility self send. In other words, we check whether their statement list matches the following pattern: <send(variable([# self ]),[# subclassresponsibility ],<>)> A second example of a programming pattern for detecting ill-designed code is the Duplicated Code bad smell [2]: Duplicated Code... A common duplication problem is when you have the same expression in two sibling subclasses.... This bad smell, together with its proposed solution, is similar to Riel s heuristic 5.10 [6], which suggests when and how to refactor two classes that implement the same state and behavior: If two or more classes have common data and behavior (i.e. methods) then those classes should each inherit from a common base class which captures those data and methods. Below, we codify two rules that check for a common expression in two classes. 7 Two classes?class1 and?class2 have common behavior if they implement a method with the same method body. Rule commonbehavior(?class1,?class2,?met1,?met2) if classimplementsmethod(?class1,,?met1), classimplementsmethod(?class2,,?met2), methodstatements(?met1,?statements), methodstatements(?met2,?statements). Having common data is codified as having a common instance variable?instvar of the same type. Rule commondata(?class1,?class2,?instvar) if instvar(?class1,?instvar), instvar(?class2,?instvar), instvartype(?class1,?instvar,?type), instvartype(?class2,?instvar,?type). Similar to the returntype predicate, our lightweight type inference rules guess the type of an instance variable by looking at all messages sent to that variable (in the scope of its class) and computing all classes that understand all these messages. In addition, initialization of variables, as well as factory methods and getting and setting methods are taken into account. 4 Supporting Software Development In the previous section we used DMP to declare many kinds of programming patterns. In this section we elaborate on how a programmer can use these rules to support him when developing or maintaining software. The rules can be used in different ways: checking 7 To save space we only show the simplest implementation.
6 whether a certain pattern is satisfied, searching source code that matches some pattern, detecting violations of patterns, and even code generation. 4.1 Checking and Searching Due to the multi-way reasoning capability of our logic language, most predicates can be used in multiple ways. To illustrate this, let us elaborate on the gettingmethod predicate of Subsection When calling the predicate with constant arguments, it merely checks whether a given method of a given class is a Getting Method for a given instance variable. When the query contains variables, we search for all values that satisfy the pattern. For example, Query gettingmethod([applicationmodel],?m,[# builder ]) returns the Getting Method for the variable builder of the Smalltalk class ApplicationModel. We can even use more than one logic variable, as in Query gettingmethod([applicationmodel],?m,?instvar) which finds all Getting Methods together with their corresponding instance variable for the class ApplicationModel. We can also use the predicate in the opposite way to find all classes that have a Getting Method for a given instance variable name : 4.2 Detecting Violations Getting Method Coming back to the Getting Method pattern, in addition to checking whether a method is a Getting Method and searching the image for occurrences of Getting Methods, we can also write queries that check the source code for violations of the Getting Method pattern. Methods that violate the encapsulation imposed by the Getting Method programming pattern are methods that directly send messages to instance variables (with the exception of Getting Methods themselves, because they are the only ones allowed to do so). The rule for detecting such violations verifies whether no method implemented in a class sends messages that have as receiver an instance variable of that class: Rule accessingviolator(?class,?meth,?iv,?violmsg) if instvar(?class,?iv), classimplementsmethod(?class,,?meth), not(gettingmethod(?class,?meth,?iv)), issentto(?class,variable(?iv),?violmsg, ). We can then invoke the query below to find all violations of the Getting Method pattern. It returns the violating method?meth that directly accesses some instance variable?iv, together with the class?class it belongs to and the violating message?msg it sends to the instance variable. Query gettingmethod(?class,?method,[# name ]) Again, this query returns several results (one for each of the classes that implements such a Getting Method). Finally, we can call the predicate with variables only, in which case all classes in the entire Smalltalk image are searched for Getting Methods. Computing such a query may take a very long time, however. A similar reasoning can be made for all other predicates that were defined in Section 3. As a second example of checking and searching we revisit the commonbehavior rule of Subsection 3.3 that tells us when to move common behavior in sibling subclasses to their common base class. We can use the rule below to find all classes?c1 and?c2 that should be refactored or to detect whether two classes have some behavior in common, and so on. The rule also returns the common base class and the methods to be moved. Rule behaviorrefactoring(?c1,?c2,?base,?m1,?m2) if subclass(?base,?c1), subclass(?base,?c2), commonbehavior(?c1,?c2,?m1,?m2). Query accessingviolator(?class,?meth,?iv,?msg) Visitor Design Pattern As an illustration of how to use the visitor predicate of Subsection 3.2 for detecting violations, consider some class hierarchy with root class ParseTreeElement representing a parse tree. We want to detect all non-abstract parse tree elements that do not comply to the Visitor pattern. To do so, we select all subclasses of ParseTreeElement that are not abstract, and for each of those we find the ones that do not comply to the visitor rule: Query hierarchy([parsetreeelement],?node), not(abstractclass(?node)), not(visitor(?visitor,?node,[# donode: ],?VisSel)) The last line in this query mentions the name of the visit-method (i.e., donode: ) used by the visitor to visit the nodes. When we do not know the name of this method, we can leave it variable. The system will then deduce the name used in this specific instance of the visitor pattern.
7 The results of this query contain the methods that do not comply to the Visitor design pattern, and that might need to be reimplemented. If the query fails, this means that all classes and methods satisfy (the structure of) the Visitor design pattern. 4.3 Code Generation Getting Method Instead of searching for Getting Methods and violations thereof, it can be useful to generate automatically the code of the Getting Methods for some instance variable of a class. This can be done by combining the gettingmethodstats predicate describing the body of a Getting Method with a primitive predicate generatemethod that generates the source code of a method from its logic parse tree description. 8 Rule generateaccessor(?class,?instvar) if instvar(?class,?instvar), Verify that no method with name?instvar exists not(classimplementsmethod(?class,?instvar, )), gettingmethodstats(?stats,?instvar), Generate code from the method parse tree description generatemethod( method(?class,?instvar,<>,<>,?stats)). Due to space limitations, we do not show the detailed implementation of the generatemethod predicate. It is a meta-predicate that makes use of the strong symbiosis between SOUL and Smalltalk to add the method (in parse-tree format) it takes as input to the Smalltalk image; see [9] for more details. Behavior refactoring As a second example of code generation, we reconsider the predicate behaviorrefactoring of Subsection 4.1. It only searches the image for common methods to be refactored. To perform the actual refactoring, we codify the Pull Up Method refactoring pattern [2]. Pull Up Method You have methods with identical results on subclasses. Move them to the superclass. We only show the easiest case where two methods have exactly the same body (typically as a result of copy and paste programming). The rule below defines how to do the refactoring. The comments (between parentheses) explain the code; the mechanics of the refactoring corresponds to what is described in [2]. 8 A method parse tree description consists of five parts: the method s class, the name of the method, its argument list, a list of temporary variables and a statement list. Rule pullupmethod(?c1,?c2) if Check that?c1 and?c2 have common behavior behaviorrefactoring(?c1,?c2,?base,?m1,?m2), Retrieve information about the common method methodname(?m1,?name), methodstatements(?m1,?stats), methodarguments(?m1,?args), methodtempvars(?m1,?temps), Verify that the common base class?base does not implement a method with the same name not(classimplementsmethod(?base,?name, )), Generate code for the new method generatemethod( method(?base,?name,?args,?temps,?stats)), Delete code of the old methods removemethod(?m1), removemethod(?m2). In addition to the generatemethod meta-predicate, this rule uses a removemethod meta-predicate to remove a given method from the Smalltalk image. Being able to generate code has the important advantage that a programmer gains time to concentrate on more intellectually-rewarding development or maintenance activities. Straightforward coding tasks can be performed partially. For example, we might imagine having some kind of design pattern tool where we just select some pattern from which a code template is automatically generated for the programmer to fill in. In the next section, we further elaborate on possible tool support and on how to integrate the DMP language with an existing development environment. 5 Tool Support Our logic meta-language SOUL is well integrated in the Smalltalk development environment. It can reason about and manipulate Smalltalk entities directly and can even execute parameterized Smalltalk source-code fragments. Conversely, SOUL queries can be executed from within Smalltalk itself. All this is achieved by implementing SOUL in Smalltalk and by using the powerful reflective capabilities of Smalltalk to obtain a good symbiosis with the logic language. More recently, SOUL was extended with a synchronization framework to build tools that rely on some kind of synchronization between design 9 and implementation [9]. It enables the construction of tools that monitor and act upon any change to the implementation or design. For example, we can make a tool to enforce the use of certain patterns in the implementation. Suppose that we want to enforce the consistent usage of the Getting Method best practice pattern throughout 9 or other high-level descriptions on top of the implementation
8 a program. The tool monitors all changes to methods and gives an error or warning whenever a programmer accepts a method that accesses an instance variable directly instead of through a Getting Method. In our experiments we worked directly at the level of the logic meta-language. We defined our own logic rules and used logic queries directly to reason about patterns. However, for programming patterns to become an explicit and active part of the development environment we need well-integrated and user-friendly support tools in that environment. One of the already developed tools is the Structural Find Application, a sophisticated search engine. This tool transparently uses logic queries to allow searching for methods or classes in the Smalltalk image using complex search patterns. The user only needs to fill in one or more simple selection fields and the Find Application will automatically generate and interpret the corresponding query for the user. For example, the Find Application may be used to find all classes that have a name matching some pattern, have a method sending some specified message and implement a method with some name. The results of the search are presented in a user-readable format. A second interesting tool that has been implemented on top of SOUL is the To Do Application. During implementation of a program it logs all violations of certain programming patterns, conventions and heuristics in a to do list. This list can be inspected later by the programmer to fix (or ignore) the detected problems. A third example (which is currently being developed) is a tool for visualizing and manipulating design patterns. It supports the definition of design patterns, generating code templates, searching for occurrences of design patterns in the source code, checking consistency of design pattern instances, evolution and transformation of design patterns, detecting and resolving conflicts and so on. Tools like the above hide the details of the logic meta-language from the programmer. However, they do not prohibit a programmer to access the logic metalanguage. Instead of using the provided high-level tools, a (power-)user can always use the query engine directly to reason about the software. For example, although the Find Application supports very powerful search queries, it is restricted to some fixed set of selection fields. By using the query engine directly, even more powerful searches can be performed, because the full SOUL syntax and all predefined predicates can be used to construct a search query. Also, a programmer can always add to the logic repository his own specific rules to declare some pattern. All available tools on top of the logic language should be open enough so that they automatically provide support for these additional patterns as well. 6 Conclusion We discussed the importance of using programming patterns to support software development and maintenance. Especially in a context of continuously evolving software, large development teams and a high turnover rate, advanced tools to support the software development process are crucial. Current-day software development environments and tools, however, provide little or no support to declare and use best practice patterns, design patterns, design heuristics, bad smells and refactoring patterns. In this paper, we proposed declarative metaprogramming as a basis for building sophisticated development tools that aid a programmer in his programming tasks. We illustrated this by expressing different kinds of programming patterns as rules in a DMP language and by showing how these rules could be used to search for occurrences of, to check, to detect violations of and to enforce programming patterns and even to generate code. DMP proved to be an ideal medium for expressing and using such rules, because: it is declarative (hence intuitive and readable); the specific benefits of logic languages: multi-way reasoning allowsoneandthesameruletobeused in many different ways; unification provides a powerful pattern matching mechanism; backtracking can find all possible solutions of a query; it is base-language independent: the rules that describe the patterns can, to a certain extent, also be used for other object-oriented languages; it is customizable: user-defined rules can easily be expressed. A programmer can declare and use his own set of rules that support his particular development and maintenance activities. Finally, if we can rely on the fact that, in a given piece of software, certain programming patterns are consistently used throughout the code, we effectively reach a higher level of abstraction of the code. This makes it possible to reason about even more powerful concepts, like architectural abstractions [5]. References [1] K. Beck. Smalltalk Best Practice Patterns. Prentice Hall PTR, 1997.
9 [2] M. Fowler. Refactoring: Improving the Design of Existing Programs. Addison-Wesley, [3] S. Fraser, A. Cockburn, L. Brajkovich, J. Coplien, L. Constantine, andd. West. OO anthropology: Crossing the chasm (panel 3). In Proceedings of OOPSLA 1996 Conference, volume 31(10) of ACM SIGPLAN Notices, pages ACM Press, October [4] E. Gamma, R. Helm, R. Johnson, andj. Vlissides. Design Patterns : Elements of Reusable Object-Oriented Software. Addison-Wesley, [5] K. Mens. Automating Architectural Conformance Checking by means of Logic Meta Programming. PhD thesis, Department of Computer Science, Vrije Universiteit Brussel, Belgium, October [6] A. J. Riel. Object-Oriented Design Heuristics. Addison- Wesley, April [7] W. Teitelman. Automatedprogrammering: The programmer s assistant. In D. R. Barstow, H. E. Shrobe, and E. Sandewall, editors, Interactive Programming Environments, pages McGraw-Hill, [8] R. Wuyts. Declarative reasoning about the structure of object-orientedsystems. In Proceedings of TOOLS USA 1998, pages IEEE Computer Society Press, [9] R. Wuyts. A Logic Meta-Programming Approach to Support Co-Evolution of Object-Oriented Design and Implementation. PhD thesis, Department of Computer Science, Vrije Universiteit Brussel, Belgium, January 2001.
Patterns in. Lecture 2 GoF Design Patterns Creational. Sharif University of Technology. Department of Computer Engineering
Patterns in Software Engineering Lecturer: Raman Ramsin Lecture 2 GoF Design Patterns Creational 1 GoF Design Patterns Principles Emphasis on flexibility and reuse through decoupling of classes. The underlying
Checking Access to Protected Members in the Java Virtual Machine
Checking Access to Protected Members in the Java Virtual Machine Alessandro Coglio Kestrel Institute 3260 Hillview Avenue, Palo Alto, CA 94304, USA Ph. +1-650-493-6871 Fax +1-650-424-1807 http://www.kestrel.edu/
Software Refactoring using New Architecture of Java Design Patterns
Software Refactoring using New Architecture of Java Design Patterns Norddin Habti, Prashant 1, 1 Departement d informatique et de recherche operationnelle, Universite de Montreal, Quebec, Canada (Dated:
Reuse Contracts: Managing the Evolution of Reusable Assets
Reuse Contracts: Managing the Evolution of Reusable Assets Patrick Steyaert, Carine Lucas, Kim Mens, Theo D Hondt Programming Technology Lab Vrije Universiteit Brussel Pleinlaan 2, 1050 Brussels, Belgium
THE IMPACT OF INHERITANCE ON SECURITY IN OBJECT-ORIENTED DATABASE SYSTEMS
THE IMPACT OF INHERITANCE ON SECURITY IN OBJECT-ORIENTED DATABASE SYSTEMS David L. Spooner Computer Science Department Rensselaer Polytechnic Institute Troy, New York 12180 The object-oriented programming
Mining a Change-Based Software Repository
Mining a Change-Based Software Repository Romain Robbes Faculty of Informatics University of Lugano, Switzerland 1 Introduction The nature of information found in software repositories determines what
Evaluating OO-CASE tools: OO research meets practice
Evaluating OO-CASE tools: OO research meets practice Danny Greefhorst, Matthijs Maat, Rob Maijers {greefhorst, maat, maijers}@serc.nl Software Engineering Research Centre - SERC PO Box 424 3500 AK Utrecht
Agile Software Development
Agile Software Development Lecturer: Raman Ramsin Lecture 13 Refactoring Part 3 1 Dealing with Generalization: Pull Up Constructor Body Pull Up Constructor Body You have constructors on subclasses with
The Class Blueprint A Visualization of the Internal Structure of Classes
The Class Blueprint A Visualization of the Internal Structure of Classes Michele Lanza Software Composition Group University Of Bern Bern, Switzerland [email protected] Stéphane Ducasse Software Composition
Glossary of Object Oriented Terms
Appendix E Glossary of Object Oriented Terms abstract class: A class primarily intended to define an instance, but can not be instantiated without additional methods. abstract data type: An abstraction
Data Abstraction and Hierarchy
Data Abstraction and Hierarchy * This research was supported by the NEC Professorship of Software Science and Engineering. Barbara Liskov Affiliation: MIT Laboratory for Computer Science Cambridge, MA,
Name of pattern types 1 Process control patterns 2 Logic architectural patterns 3 Organizational patterns 4 Analytic patterns 5 Design patterns 6
The Researches on Unified Pattern of Information System Deng Zhonghua,Guo Liang,Xia Yanping School of Information Management, Wuhan University Wuhan, Hubei, China 430072 Abstract: This paper discusses
The WebShop E-Commerce Framework
The WebShop E-Commerce Framework Marcus Fontoura IBM Almaden Research Center 650 Harry Road, San Jose, CA 95120, U.S.A. e-mail: fontouraalmaden.ibm.com Wolfgang Pree Professor of Computer Science Software
QTP Open Source Test Automation Framework Introduction
Version 1.0 April 2009 D ISCLAIMER Verbatim copying and distribution of this entire article are permitted worldwide, without royalty, in any medium, provided this notice is preserved. Table of Contents
Moving from CS 61A Scheme to CS 61B Java
Moving from CS 61A Scheme to CS 61B Java Introduction Java is an object-oriented language. This document describes some of the differences between object-oriented programming in Scheme (which we hope you
An Eclipse Plug-In for Visualizing Java Code Dependencies on Relational Databases
An Eclipse Plug-In for Visualizing Java Code Dependencies on Relational Databases Paul L. Bergstein, Priyanka Gariba, Vaibhavi Pisolkar, and Sheetal Subbanwad Dept. of Computer and Information Science,
Dynamic Adaptability of Services in Enterprise JavaBeans Architecture
1. Introduction Dynamic Adaptability of Services in Enterprise JavaBeans Architecture Zahi Jarir *, Pierre-Charles David **, Thomas Ledoux ** [email protected], {pcdavid, ledoux}@emn.fr (*) Faculté
Object-Oriented Software Specification in Programming Language Design and Implementation
Object-Oriented Software Specification in Programming Language Design and Implementation Barrett R. Bryant and Viswanathan Vaidyanathan Department of Computer and Information Sciences University of Alabama
From Object Oriented Conceptual Modeling to Automated Programming in Java
From Object Oriented Conceptual Modeling to Automated Programming in Java Oscar Pastor, Vicente Pelechano, Emilio Insfrán, Jaime Gómez Department of Information Systems and Computation Valencia University
Tool Support for Software Variability Management and Product Derivation in Software Product Lines
Tool Support for Software Variability Management and Product Derivation in Software s Hassan Gomaa 1, Michael E. Shin 2 1 Dept. of Information and Software Engineering, George Mason University, Fairfax,
Supporting Software Development Process Using Evolution Analysis : a Brief Survey
Supporting Software Development Process Using Evolution Analysis : a Brief Survey Samaneh Bayat Department of Computing Science, University of Alberta, Edmonton, Canada [email protected] Abstract During
Génie Logiciel et Gestion de Projets. Patterns
Génie Logiciel et Gestion de Projets Patterns 1 Alexander s patterns Christoffer Alexander The Timeless Way of Building, Christoffer Alexander, Oxford University Press, 1979, ISBN 0195024028 Each pattern
Java Application Developer Certificate Program Competencies
Java Application Developer Certificate Program Competencies After completing the following units, you will be able to: Basic Programming Logic Explain the steps involved in the program development cycle
Structuring Product-lines: A Layered Architectural Style
Structuring Product-lines: A Layered Architectural Style Tommi Myllymäki, Kai Koskimies, and Tommi Mikkonen Institute of Software Systems, Tampere University of Technology Box 553, FIN-33101 Tampere, Finland
Design Patterns in Parsing
Abstract Axel T. Schreiner Department of Computer Science Rochester Institute of Technology 102 Lomb Memorial Drive Rochester NY 14623-5608 USA [email protected] Design Patterns in Parsing James E. Heliotis
Lightweight Data Integration using the WebComposition Data Grid Service
Lightweight Data Integration using the WebComposition Data Grid Service Ralph Sommermeier 1, Andreas Heil 2, Martin Gaedke 1 1 Chemnitz University of Technology, Faculty of Computer Science, Distributed
Comp 411 Principles of Programming Languages Lecture 34 Semantics of OO Languages. Corky Cartwright Swarat Chaudhuri November 30, 20111
Comp 411 Principles of Programming Languages Lecture 34 Semantics of OO Languages Corky Cartwright Swarat Chaudhuri November 30, 20111 Overview I In OO languages, data values (except for designated non-oo
Chap 1. Introduction to Software Architecture
Chap 1. Introduction to Software Architecture 1. Introduction 2. IEEE Recommended Practice for Architecture Modeling 3. Architecture Description Language: the UML 4. The Rational Unified Process (RUP)
Firewall Builder Architecture Overview
Firewall Builder Architecture Overview Vadim Zaliva Vadim Kurland Abstract This document gives brief, high level overview of existing Firewall Builder architecture.
Chapter 6: Programming Languages
Chapter 6: Programming Languages Computer Science: An Overview Eleventh Edition by J. Glenn Brookshear Copyright 2012 Pearson Education, Inc. Chapter 6: Programming Languages 6.1 Historical Perspective
Introduction. Observation Patterns. Accounting Patterns. How to use Patterns
Analysis Martin Fowler fowler@acm acm.org http://ourworld ourworld.compuserve.com/homepages/martin_fowler Page Martin Fowler 9//99 What we will cover Introduction Observation Accounting How to use Page
The Phases of an Object-Oriented Application
The Phases of an Object-Oriented Application Reprinted from the Feb 1992 issue of The Smalltalk Report Vol. 1, No. 5 By: Rebecca J. Wirfs-Brock There is never enough time to get it absolutely, perfectly
Component visualization methods for large legacy software in C/C++
Annales Mathematicae et Informaticae 44 (2015) pp. 23 33 http://ami.ektf.hu Component visualization methods for large legacy software in C/C++ Máté Cserép a, Dániel Krupp b a Eötvös Loránd University [email protected]
Software quality improvement via pattern matching
Software quality improvement via pattern matching Radu Kopetz and Pierre-Etienne Moreau INRIA & LORIA {Radu.Kopetz, [email protected] Abstract. Nested if-then-else statements is the most common
The Real Challenges of Configuration Management
The Real Challenges of Configuration Management McCabe & Associates Table of Contents The Real Challenges of CM 3 Introduction 3 Parallel Development 3 Maintaining Multiple Releases 3 Rapid Development
ABSTRACT FACTORY AND SINGLETON DESIGN PATTERNS TO CREATE DECORATOR PATTERN OBJECTS IN WEB APPLICATION
ABSTRACT FACTORY AND SINGLETON DESIGN PATTERNS TO CREATE DECORATOR PATTERN OBJECTS IN WEB APPLICATION Vijay K Kerji Department of Computer Science and Engineering, PDA College of Engineering,Gulbarga,
Formal Engineering for Industrial Software Development
Shaoying Liu Formal Engineering for Industrial Software Development Using the SOFL Method With 90 Figures and 30 Tables Springer Contents Introduction 1 1.1 Software Life Cycle... 2 1.2 The Problem 4 1.3
GenericServ, a Generic Server for Web Application Development
EurAsia-ICT 2002, Shiraz-Iran, 29-31 Oct. GenericServ, a Generic Server for Web Application Development Samar TAWBI PHD student [email protected] Bilal CHEBARO Assistant professor [email protected] Abstract
SDT: A Programming Language for Debugging (Working Paper)
SDT: A Programming Language for Debugging (Working Paper) Steven P. Reiss Department of Computer Science Brown University Providence, RI 02912 [email protected] (401) 863-7641 January, 1989 Abstract This
Cedalion A Language Oriented Programming Language (Extended Abstract)
Cedalion A Language Oriented Programming Language (Extended Abstract) David H. Lorenz Boaz Rosenan The Open University of Israel Abstract Implementations of language oriented programming (LOP) are typically
The Oregon Software Development Process
The Oregon Software Development Process Till Schümmer 1 and Robert Slagter 2 1 Computer Science Department, FernUniversität in Hagen, Universitätsstrasse 1, 58084 Hagen, Germany [email protected]
Chapter 1. Dr. Chris Irwin Davis Email: [email protected] Phone: (972) 883-3574 Office: ECSS 4.705. CS-4337 Organization of Programming Languages
Chapter 1 CS-4337 Organization of Programming Languages Dr. Chris Irwin Davis Email: [email protected] Phone: (972) 883-3574 Office: ECSS 4.705 Chapter 1 Topics Reasons for Studying Concepts of Programming
Xtreme RUP. Ne t BJECTIVES. Lightening Up the Rational Unified Process. 2/9/2001 Copyright 2001 Net Objectives 1. Agenda
Xtreme RUP by Ne t BJECTIVES Lightening Up the Rational Unified Process 2/9/2001 Copyright 2001 Net Objectives 1 RUP Overview Agenda Typical RUP Challenges Xtreme Programming Paradigm Document driven or
COMPARISON OF OBJECT-ORIENTED AND PROCEDURE-BASED COMPUTER LANGUAGES: CASE STUDY OF C++ PROGRAMMING
COMPARISON OF OBJECT-ORIENTED AND PROCEDURE-BASED COMPUTER LANGUAGES: CASE STUDY OF C++ PROGRAMMING Kuan C. Chen, Ph.D. Assistant Professor Management Information Systems School of Management Purdue University
Gadget: A Tool for Extracting the Dynamic Structure of Java Programs
Gadget: A Tool for Extracting the Dynamic Structure of Java Programs Juan Gargiulo and Spiros Mancoridis Department of Mathematics & Computer Science Drexel University Philadelphia, PA, USA e-mail: gjgargiu,smancori
Dinopolis Java Coding Convention
Dinopolis Java Coding Convention Revision : 1.1 January 11, 2001 Abstract Please note that this version of the Coding convention is very much based on IICM s internal Dino coding convention that was used
Curriculum Map. Discipline: Computer Science Course: C++
Curriculum Map Discipline: Computer Science Course: C++ August/September: How can computer programs make problem solving easier and more efficient? In what order does a computer execute the lines of code
Reactive Variability Realization with Test-Driven Development and Refactoring
Reactive Variability Realization with Test-Driven Development and Refactoring Glauco Silva Neves Informatics and Statistics Department - INE Federal University of Santa Catarina - UFSC Florianópolis, Brazil
A refined architecture for DRM
A refined architecture for DRM Koen Buyens Sam Michiels Wouter Joosen Report CW 450, June 2006 nkatholieke Universiteit Leuven Department of Computer Science Celestijnenlaan 200A B-3001 Heverlee (Belgium)
Structural Design Patterns Used in Data Structures Implementation
Structural Design Patterns Used in Data Structures Implementation Niculescu Virginia Department of Computer Science Babeş-Bolyai University, Cluj-Napoca email address: [email protected] November,
Ontological Representations of Software Patterns
Ontological Representations of Software Patterns Jean-Marc Rosengard and Marian F. Ursu University of London http://w2.syronex.com/jmr/ Abstract. This paper 1 is based on and advocates the trend in software
Defining and Checking Model Smells: A Quality Assurance Task for Models based on the Eclipse Modeling Framework
Defining and Checking Model Smells: A Quality Assurance Task for Models based on the Eclipse Modeling Framework Thorsten Arendt a, Matthias Burhenne a, Gabriele Taentzer a a Philipps-Universität Marburg,
How Can Data Sources Specify Their Security Needs to a Data Warehouse?
How Can Data Sources Specify Their Security Needs to a Data Warehouse? Arnon Rosenthal The MITRE Corporation [email protected] Edward Sciore Boston College (and MITRE) [email protected] Abstract In current warehouse
The Learning Psychology of Visual Programming for Object-Orientation
125 The Learning Psychology of Visual Programming for Object-Orientation Mark Ireland, Roger Stone and Ray Dawson Department of Computer Studies Loughborough University of Technology Loughborough, Leicestershire,
Enterprise Integration: operational models of business processes and workflow systems *
Enterprise Integration: operational models of business processes and workflow systems. 1 Enterprise Integration: operational models of business processes and workflow systems * G.Bruno 1, C.Reyneri 2 and
Code Qualities and Coding Practices
Code Qualities and Coding Practices Practices to Achieve Quality Scott L. Bain and the Net Objectives Agile Practice 13 December 2007 Contents Overview... 3 The Code Quality Practices... 5 Write Tests
ASSISTING REFACTORING TOOL DEVELOPMENT THROUGH REFACTORING CHARACTERIZATION
ASSISTING REFACTORING TOOL DEVELOPMENT THROUGH REFACTORING CHARACTERIZATION Raúl Marticorena, Carlos López Language and Informatic Systems, University of Burgos, EPS Campus Vena Edificio C, Burgos, Spain
Object Oriented Programming and the Objective-C Programming Language 1.0. (Retired Document)
Object Oriented Programming and the Objective-C Programming Language 1.0 (Retired Document) Contents Introduction to The Objective-C Programming Language 1.0 7 Who Should Read This Document 7 Organization
Chapter 3 Chapter 3 Service-Oriented Computing and SOA Lecture Note
Chapter 3 Chapter 3 Service-Oriented Computing and SOA Lecture Note Text book of CPET 545 Service-Oriented Architecture and Enterprise Application: SOA Principles of Service Design, by Thomas Erl, ISBN
An Exception Monitoring System for Java
An Exception Monitoring System for Java Heejung Ohe and Byeong-Mo Chang Department of Computer Science, Sookmyung Women s University, Seoul 140-742, Korea {lutino, [email protected] Abstract. Exception
Business Modeling with UML
Business Modeling with UML Hans-Erik Eriksson and Magnus Penker, Open Training Hans-Erik In order to keep up and be competitive, all companies Ericsson is and enterprises must assess the quality of their
A Visual Language Based System for the Efficient Management of the Software Development Process.
A Visual Language Based System for the Efficient Management of the Software Development Process. G. COSTAGLIOLA, G. POLESE, G. TORTORA and P. D AMBROSIO * Dipartimento di Informatica ed Applicazioni, Università
Functional Programming
FP 2005 1.1 3 Functional Programming WOLFRAM KAHL [email protected] Department of Computing and Software McMaster University FP 2005 1.2 4 What Kinds of Programming Languages are There? Imperative telling
A Meeting Room Scheduling Problem
A Scheduling Problem Objective Engineering, Inc. 699 Windsong Trail Austin, Texas 78746 512-328-9658 FAX: 512-328-9661 [email protected] http://www.oeng.com Objective Engineering, Inc., 1999-2007. Photocopying,
Chapter 8 The Enhanced Entity- Relationship (EER) Model
Chapter 8 The Enhanced Entity- Relationship (EER) Model Copyright 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley Chapter 8 Outline Subclasses, Superclasses, and Inheritance Specialization
Enforcing Data Quality Rules for a Synchronized VM Log Audit Environment Using Transformation Mapping Techniques
Enforcing Data Quality Rules for a Synchronized VM Log Audit Environment Using Transformation Mapping Techniques Sean Thorpe 1, Indrajit Ray 2, and Tyrone Grandison 3 1 Faculty of Engineering and Computing,
JOURNAL OF OBJECT TECHNOLOGY
JOURNAL OF OBJECT TECHNOLOGY Online at http://www.jot.fm. Published by ETH Zurich, Chair of Software Engineering JOT, 2007 Vol. 6, No. 1, January-February 2007 CM Configuration Change Management John D.
The Smalltalk Programming Language. Beatrice Åkerblom [email protected]
The Smalltalk Programming Language Beatrice Åkerblom [email protected] 'The best way to predict the future is to invent it' - Alan Kay. History of Smalltalk Influenced by Lisp and Simula Object-oriented
Business Rules and Business
Page 1 of 5 Business Rules and Business Intelligence Information Management Magazine, April 2007 Robert Blasum Business rules represent an essential part of any performance management system and any business
Generating Aspect Code from UML Models
Generating Aspect Code from UML Models Iris Groher Siemens AG, CT SE 2 Otto-Hahn-Ring 6 81739 Munich, Germany [email protected] Stefan Schulze Siemens AG, CT SE 2 Otto-Hahn-Ring 6 81739 Munich,
KITES TECHNOLOGY COURSE MODULE (C, C++, DS)
KITES TECHNOLOGY 360 Degree Solution www.kitestechnology.com/academy.php [email protected] [email protected] Contact: - 8961334776 9433759247 9830639522.NET JAVA WEB DESIGN PHP SQL, PL/SQL
Abstraction in Computer Science & Software Engineering: A Pedagogical Perspective
Orit Hazzan's Column Abstraction in Computer Science & Software Engineering: A Pedagogical Perspective This column is coauthored with Jeff Kramer, Department of Computing, Imperial College, London ABSTRACT
JMulTi/JStatCom - A Data Analysis Toolkit for End-users and Developers
JMulTi/JStatCom - A Data Analysis Toolkit for End-users and Developers Technology White Paper JStatCom Engineering, www.jstatcom.com by Markus Krätzig, June 4, 2007 Abstract JStatCom is a software framework
JetBrains ReSharper 2.0 Overview Introduction ReSharper is undoubtedly the most intelligent add-in to Visual Studio.NET 2003 and 2005. It greatly increases the productivity of C# and ASP.NET developers,
Towards Software Configuration Management for Test-Driven Development
Towards Software Configuration Management for Test-Driven Development Tammo Freese OFFIS, Escherweg 2, 26121 Oldenburg, Germany [email protected] Abstract. Test-Driven Development is a technique where
An Automatic Reversible Transformation from Composite to Visitor in Java
An Automatic Reversible Transformation from Composite to Visitor in Java Akram To cite this version: Akram. An Automatic Reversible Transformation from Composite to Visitor in Java. CIEL 2012, P. Collet,
Configuring Firewalls An XML-based Approach to Modelling and Implementing Firewall Configurations
Configuring Firewalls An XML-based Approach to Modelling and Implementing Firewall Configurations Simon R. Chudley and Ulrich Ultes-Nitsche Department of Electronics and Computer Science, University of
Construction Principles and Design Patterns. Flyweight, Bridge, Builder
Construction Principles and Design Patterns Flyweight, Bridge, Builder 1 The Flyweight Design Pattern: Structure Use: To avoid employing a large number of objects with similar state When objects with intrinsic
Development models. 1 Introduction. 2 Analyzing development models. R. Kuiper and E.J. Luit
Development models R. Kuiper and E.J. Luit 1 Introduction We reconsider the classical development models: the Waterfall Model [Bo76], the V-Model [Ro86], the Spiral Model [Bo88], together with the further
The CLIPS environment. The CLIPS programming language. CLIPS production rules language - facts. Notes
The CLIPS environment The CLIPS environment CLIPS is an environment to develop knowledge based systems It defines a programming language that allows to represent declarative and procedural knowledge This
Lecture 1: Introduction
Programming Languages Lecture 1: Introduction Benjamin J. Keller Department of Computer Science, Virginia Tech Programming Languages Lecture 1 Introduction 2 Lecture Outline Preview History of Programming
Composing Concerns with a Framework Approach
Composing Concerns with a Framework Approach Constantinos A. Constantinides 1,2 and Tzilla Elrad 2 1 Mathematical and Computer Sciences Department Loyola University Chicago [email protected] 2 Concurrent
The WebShop e-commerce framework
The WebShop e-commerce framework Marcus Fontoura 1, Wolfgang Pree 2, and Bernhard Rumpe 3 1 Cyberspace and Web Technology Department, IBM Almaden Research Center 650 Harry Rd., San Jose, CA, 91520, U.S.A
Java (12 Weeks) Introduction to Java Programming Language
Java (12 Weeks) Topic Lecture No. Introduction to Java Programming Language 1 An Introduction to Java o Java as a Programming Platform, The Java "White Paper" Buzzwords, Java and the Internet, A Short
Integrating Formal Models into the Programming Languages Course
Integrating Formal Models into the Programming Languages Course Allen B. Tucker Robert E. Noonan Computer Science Department Computer Science Department Bowdoin College College of William and Mary Brunswick,
How To Understand And Understand Common Lisp
Language-Oriented Programming am Beispiel Lisp Arbeitskreis Objekttechnologie Norddeutschland HAW Hamburg, 6.7.2009 Prof. Dr. Bernhard Humm Hochschule Darmstadt, FB Informatik und Capgemini sd&m Research
Language Evaluation Criteria. Evaluation Criteria: Readability. Evaluation Criteria: Writability. ICOM 4036 Programming Languages
ICOM 4036 Programming Languages Preliminaries Dr. Amirhossein Chinaei Dept. of Electrical & Computer Engineering UPRM Spring 2010 Language Evaluation Criteria Readability: the ease with which programs
