<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.expertiza.ncsu.edu/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Discostu</id>
	<title>Expertiza_Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.expertiza.ncsu.edu/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Discostu"/>
	<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=Special:Contributions/Discostu"/>
	<updated>2026-05-25T09:43:01Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.41.0</generator>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki3_teamhelm&amp;diff=29492</id>
		<title>CSC/ECE 517 Fall 2009/wiki3 teamhelm</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki3_teamhelm&amp;diff=29492"/>
		<updated>2009-11-19T03:24:23Z</updated>

		<summary type="html">&lt;p&gt;Discostu: /* '''''Conclusion''''' */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''The Release Reuse Equivalency Principle (REP)''' ==&lt;br /&gt;
Components can be effectively reused only if they are released through a tracking system.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=='''''Concept'''''==&lt;br /&gt;
&lt;br /&gt;
The Release Reuse Equivalency Principle (REP), first introduced by [http://en.wikipedia.org/wiki/Robert_Cecil_Martin Bob Martin], is described as follows:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;''The granule of reuse is the granule of release.''&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Martin elaborates: &amp;quot;A reusable element, be it a component, a class, or a cluster of classes, cannot be&lt;br /&gt;
reused unless it is managed by a release system of some kind. Users will be unwilling&lt;br /&gt;
to use the element if they are forced to upgrade every time the author changes it.&lt;br /&gt;
Thus. even though the author has released a new version of his reusable element, he&lt;br /&gt;
must be willing to support and maintain older versions while his customers go about&lt;br /&gt;
the slow business of getting ready to upgrade. Thus, clients will refuse to reuse an element&lt;br /&gt;
unless the author promises to keep track of version numbers, and maintain old&lt;br /&gt;
versions for awhile.&lt;br /&gt;
Therefore, one criterion for grouping classes into packages is reuse. Since packages&lt;br /&gt;
are the unit of release, they are also the unit of reuse. Therefore architects would do&lt;br /&gt;
well to group reusable classes together into packages.&amp;quot; [1]&lt;br /&gt;
&lt;br /&gt;
=='''''Description'''''==&lt;br /&gt;
&lt;br /&gt;
Martin describes a &amp;quot;release system&amp;quot; in his concept, which refers to a system that is able to track versions of code as it is changed. This is also sometimes referred to as [http://en.wikipedia.org/wiki/Version_control version control]. Some common examples of version control are [http://en.wikipedia.org/wiki/Subversion_%28software%29 SVN], [http://en.wikipedia.org/wiki/Concurrent_Versions_System CVS] and [http://en.wikipedia.org/wiki/Cmvc CMVC].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Martin also states that customers are slow to upgrade newer versions of code. This is commonly true for several reasons, including fear of instability of software, internal process, management approvals, and downtime for software systems.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Another critical concept here is that Martin states clients will refuse to upgrade unless the author tracks version numbers. This is related to the previous concept, where a client or customer, because of the above factors, may need to revert the system to a previous version of the code because the new version has caused a problem or outage.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
REP has also been described in the following way:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;..in order to effectively reuse code it must arrive in a complete, black-box, package that is to be used but not changed. Users of the code are shielded from changes to it because they can choose when to integrate changes from the package into their own code. While this supports code ownership, and even promotes it, it does not enforce it.&amp;quot; [2]&lt;br /&gt;
&lt;br /&gt;
Further elaboration on REP is noted here:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;I reuse code if, and only if, I never need to look at&lt;br /&gt;
the [http://en.wikipedia.org/wiki/Source_code source code] (other than the public portions of header files). I need only link with static&lt;br /&gt;
[http://en.wikipedia.org/wiki/Library_%28computing%29 libraries] or include dynamic libraries. Whenever these libraries are fixed or enhanced, I&lt;br /&gt;
receive a new version which I can then integrate into my system when opportunity allows. That is, I expect the code I am reusing to be treated like a product. It is not maintained&lt;br /&gt;
by me. It is not distributed by me. I am the customer, and the author, or some other entity,&lt;br /&gt;
is responsible for maintaining it. Thus, I can reuse nothing that is not also released. Moreover, when I reuse something&lt;br /&gt;
in a released library, I am in effect a client of the entire library.&amp;quot;[3]&lt;br /&gt;
&lt;br /&gt;
In a nutshell, Martin is stating that reuse (not copying) is useless and meaningless without release. The concept of reuse is vital to elegant [http://en.wikipedia.org/wiki/Object_oriented_design Object-Oriented design] and therefore cannot be properly maintained without release.&lt;br /&gt;
&lt;br /&gt;
=='''''Advantages'''''==&lt;br /&gt;
&lt;br /&gt;
The obvious advantages of REP are:&lt;br /&gt;
&lt;br /&gt;
1. [http://en.wikipedia.org/wiki/Software_maintenance Maintainability]. There is no need to maintain reused code. This is done by the owner of the reused (released) code.&amp;lt;br&amp;gt;&lt;br /&gt;
2. Flexibility. The consumer of the reused code can decide what version and on what timetable the reused code is adopted.&amp;lt;br&amp;gt;&lt;br /&gt;
3. Enhancements. There is no need to make the reused code more efficient or to add function. New function can be added by upgrading to a new version of the reused code.&lt;br /&gt;
&lt;br /&gt;
=='''''Disadvantages'''''==&lt;br /&gt;
&lt;br /&gt;
As REP is a [http://en.wikipedia.org/wiki/Cohesion_%28computer_science%29 Cohesion] Principle, the disadvantages would be similar to disadvantages of cohesion principles.&lt;br /&gt;
&lt;br /&gt;
1. REP is not simple for the maintainer of the code. The code owner must maintain several [http://en.wikipedia.org/wiki/Software_versioning versions] of the code, as well as large [http://en.wikipedia.org/wiki/Software_package_%28installation%29 packages].&amp;lt;br&amp;gt;&lt;br /&gt;
2. The package structure cannot be designed from the top down, meaning that it would not be one of the first things about a system that is designed. Because of this, the package structure remains in a constant state of flux. [3]&amp;lt;br&amp;gt;&lt;br /&gt;
3. The best [http://en.wikipedia.org/wiki/Software_design design] philosophy cannot depend solely on REP. REP is best suited for a system that has gone through the initial planning, design and development stages to ensure that the package structure can be utilized effectively.&lt;br /&gt;
&lt;br /&gt;
=='''''Example'''''==&lt;br /&gt;
&lt;br /&gt;
The Java Boutique describes a [http://javaboutique.internet.com/Case_Study/ tutorial] for designing a system with, among other principles, REP.&lt;br /&gt;
&lt;br /&gt;
=='''''Conclusion'''''==&lt;br /&gt;
&lt;br /&gt;
Code should be reused by including the released [http://en.wikipedia.org/wiki/Software_library library], not by copying the code. This ensures the reused code is maintained by a single authority to avoid the divergence of the reused code. In fact, the user should never see the source code for reuse except the included header files - &amp;lt;b&amp;gt;The unit of reuse is the unit of release&amp;lt;/b&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
The users of the library need to know the version/signature for dependency control and for reliable reversal to the originals after failed upgrade. The author need the same information to maintain and support the released product - &amp;lt;b&amp;gt;Effective reuse requires a change control system&amp;lt;/b&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Though a class is the &amp;lt;i&amp;gt;de facto&amp;lt;/i&amp;gt; unit of reuse, its reuse is mostly confined to the author of related classes and collectively make them a large functional unit or package. The REP is targeting a wide audience who are more interested in reuse of a large functional unit or a class in that context. Keeping track of versions of individual classes would be, more often than not, burdensome to users who both use multiple classes within the same package and authors who need to maintain individual classes and their inter-dependencies within the large functional unit. &amp;lt;b&amp;gt;The effective unit of reuse and release is the package&amp;lt;/B&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
REP not only applies to external users, but also applies within the organization among different development groups.&lt;br /&gt;
&lt;br /&gt;
=='''''References'''''==&lt;br /&gt;
&lt;br /&gt;
[1] Design Principles and Patterns: http://www.objectmentor.com/resources/articles/Principles_and_Patterns.pdf &amp;lt;br&amp;gt;&lt;br /&gt;
[2] Reuse Release Equivalence Principle: http://c2.com/cgi/wiki$?ReuseReleaseEquivalencePrinciple&amp;lt;br&amp;gt;&lt;br /&gt;
[3] Granularity: http://www.objectmentor.com/resources/articles/granularity.pdf&amp;lt;br&amp;gt;&lt;br /&gt;
[4] Object Oriented Software Construction, Bertrand Meyer, Prentice Hall, 1988&lt;/div&gt;</summary>
		<author><name>Discostu</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki3_teamhelm&amp;diff=29481</id>
		<title>CSC/ECE 517 Fall 2009/wiki3 teamhelm</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki3_teamhelm&amp;diff=29481"/>
		<updated>2009-11-19T03:19:10Z</updated>

		<summary type="html">&lt;p&gt;Discostu: /* '''''Disadvantages''''' */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''The Release Reuse Equivalency Principle (REP)''' ==&lt;br /&gt;
Components can be effectively reused only if they are released through a tracking system.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=='''''Concept'''''==&lt;br /&gt;
&lt;br /&gt;
The Release Reuse Equivalency Principle (REP), first introduced by [http://en.wikipedia.org/wiki/Robert_Cecil_Martin Bob Martin], is described as follows:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;''The granule of reuse is the granule of release.''&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Martin elaborates: &amp;quot;A reusable element, be it a component, a class, or a cluster of classes, cannot be&lt;br /&gt;
reused unless it is managed by a release system of some kind. Users will be unwilling&lt;br /&gt;
to use the element if they are forced to upgrade every time the author changes it.&lt;br /&gt;
Thus. even though the author has released a new version of his reusable element, he&lt;br /&gt;
must be willing to support and maintain older versions while his customers go about&lt;br /&gt;
the slow business of getting ready to upgrade. Thus, clients will refuse to reuse an element&lt;br /&gt;
unless the author promises to keep track of version numbers, and maintain old&lt;br /&gt;
versions for awhile.&lt;br /&gt;
Therefore, one criterion for grouping classes into packages is reuse. Since packages&lt;br /&gt;
are the unit of release, they are also the unit of reuse. Therefore architects would do&lt;br /&gt;
well to group reusable classes together into packages.&amp;quot; [1]&lt;br /&gt;
&lt;br /&gt;
=='''''Description'''''==&lt;br /&gt;
&lt;br /&gt;
Martin describes a &amp;quot;release system&amp;quot; in his concept, which refers to a system that is able to track versions of code as it is changed. This is also sometimes referred to as [http://en.wikipedia.org/wiki/Version_control version control]. Some common examples of version control are [http://en.wikipedia.org/wiki/Subversion_%28software%29 SVN], [http://en.wikipedia.org/wiki/Concurrent_Versions_System CVS] and [http://en.wikipedia.org/wiki/Cmvc CMVC].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Martin also states that customers are slow to upgrade newer versions of code. This is commonly true for several reasons, including fear of instability of software, internal process, management approvals, and downtime for software systems.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Another critical concept here is that Martin states clients will refuse to upgrade unless the author tracks version numbers. This is related to the previous concept, where a client or customer, because of the above factors, may need to revert the system to a previous version of the code because the new version has caused a problem or outage.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
REP has also been described in the following way:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;..in order to effectively reuse code it must arrive in a complete, black-box, package that is to be used but not changed. Users of the code are shielded from changes to it because they can choose when to integrate changes from the package into their own code. While this supports code ownership, and even promotes it, it does not enforce it.&amp;quot; [2]&lt;br /&gt;
&lt;br /&gt;
Further elaboration on REP is noted here:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;I reuse code if, and only if, I never need to look at&lt;br /&gt;
the [http://en.wikipedia.org/wiki/Source_code source code] (other than the public portions of header files). I need only link with static&lt;br /&gt;
[http://en.wikipedia.org/wiki/Library_%28computing%29 libraries] or include dynamic libraries. Whenever these libraries are fixed or enhanced, I&lt;br /&gt;
receive a new version which I can then integrate into my system when opportunity allows. That is, I expect the code I am reusing to be treated like a product. It is not maintained&lt;br /&gt;
by me. It is not distributed by me. I am the customer, and the author, or some other entity,&lt;br /&gt;
is responsible for maintaining it. Thus, I can reuse nothing that is not also released. Moreover, when I reuse something&lt;br /&gt;
in a released library, I am in effect a client of the entire library.&amp;quot;[3]&lt;br /&gt;
&lt;br /&gt;
In a nutshell, Martin is stating that reuse (not copying) is useless and meaningless without release. The concept of reuse is vital to elegant [http://en.wikipedia.org/wiki/Object_oriented_design Object-Oriented design] and therefore cannot be properly maintained without release.&lt;br /&gt;
&lt;br /&gt;
=='''''Advantages'''''==&lt;br /&gt;
&lt;br /&gt;
The obvious advantages of REP are:&lt;br /&gt;
&lt;br /&gt;
1. [http://en.wikipedia.org/wiki/Software_maintenance Maintainability]. There is no need to maintain reused code. This is done by the owner of the reused (released) code.&amp;lt;br&amp;gt;&lt;br /&gt;
2. Flexibility. The consumer of the reused code can decide what version and on what timetable the reused code is adopted.&amp;lt;br&amp;gt;&lt;br /&gt;
3. Enhancements. There is no need to make the reused code more efficient or to add function. New function can be added by upgrading to a new version of the reused code.&lt;br /&gt;
&lt;br /&gt;
=='''''Disadvantages'''''==&lt;br /&gt;
&lt;br /&gt;
As REP is a [http://en.wikipedia.org/wiki/Cohesion_%28computer_science%29 Cohesion] Principle, the disadvantages would be similar to disadvantages of cohesion principles.&lt;br /&gt;
&lt;br /&gt;
1. REP is not simple for the maintainer of the code. The code owner must maintain several [http://en.wikipedia.org/wiki/Software_versioning versions] of the code, as well as large [http://en.wikipedia.org/wiki/Software_package_%28installation%29 packages].&amp;lt;br&amp;gt;&lt;br /&gt;
2. The package structure cannot be designed from the top down, meaning that it would not be one of the first things about a system that is designed. Because of this, the package structure remains in a constant state of flux. [3]&amp;lt;br&amp;gt;&lt;br /&gt;
3. The best [http://en.wikipedia.org/wiki/Software_design design] philosophy cannot depend solely on REP. REP is best suited for a system that has gone through the initial planning, design and development stages to ensure that the package structure can be utilized effectively.&lt;br /&gt;
&lt;br /&gt;
=='''''Example'''''==&lt;br /&gt;
&lt;br /&gt;
The Java Boutique describes a [http://javaboutique.internet.com/Case_Study/ tutorial] for designing a system with, among other principles, REP.&lt;br /&gt;
&lt;br /&gt;
=='''''Conclusion'''''==&lt;br /&gt;
&lt;br /&gt;
Code should be reused by including the released library, not by copying the code. This ensures the reused code is maintained by a single authority to avoid the divergence of the reused code. In fact the user should never see the source code for reuse except the included header files - &amp;lt;b&amp;gt;The unit of reuse is the unit of release&amp;lt;/b&amp;gt; &lt;br /&gt;
&lt;br /&gt;
The users of the library need to know the version/signature for dependency control and for reliable reversal to the originals after failed upgrade. The author need the same information to maintain and support the released product - &amp;lt;b&amp;gt;Effective reuse requires a change control system&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Though a class is the &amp;lt;i&amp;gt;de facto&amp;lt;/i&amp;gt; unit of reuse, its reuse is mostly confined to the author who also authors related classes and collectively make them a large functional unit - package. The REP is targeting a broad range of audience who are more interested in reuse this large functional unit or a class in that context. Also keeping track of version of individual classes would be burdensome to both users who, more often than not, use multiple classes within the same package, and author who need to maintain individual classes and their inter-dependencies within the large functional unit. &amp;lt;b&amp;gt;The effective unit of reuse and release is the package&amp;lt;/B&amp;gt;&lt;br /&gt;
&lt;br /&gt;
REP not only applies to external users, but also applies within the organization among different development groups.&lt;br /&gt;
&lt;br /&gt;
=='''''References'''''==&lt;br /&gt;
&lt;br /&gt;
[1] Design Principles and Patterns: http://www.objectmentor.com/resources/articles/Principles_and_Patterns.pdf &amp;lt;br&amp;gt;&lt;br /&gt;
[2] Reuse Release Equivalence Principle: http://c2.com/cgi/wiki$?ReuseReleaseEquivalencePrinciple&amp;lt;br&amp;gt;&lt;br /&gt;
[3] Granularity: http://www.objectmentor.com/resources/articles/granularity.pdf&amp;lt;br&amp;gt;&lt;br /&gt;
[4] Object Oriented Software Construction, Bertrand Meyer, Prentice Hall, 1988&lt;/div&gt;</summary>
		<author><name>Discostu</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki3_teamhelm&amp;diff=29445</id>
		<title>CSC/ECE 517 Fall 2009/wiki3 teamhelm</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki3_teamhelm&amp;diff=29445"/>
		<updated>2009-11-19T03:04:41Z</updated>

		<summary type="html">&lt;p&gt;Discostu: /* '''''Advantages''''' */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''The Release Reuse Equivalency Principle (REP)''' ==&lt;br /&gt;
Components can be effectively reused only if they are released through a tracking system.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=='''''Concept'''''==&lt;br /&gt;
&lt;br /&gt;
The Release Reuse Equivalency Principle (REP), first introduced by [http://en.wikipedia.org/wiki/Robert_Cecil_Martin Bob Martin], is described as follows:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;''The granule of reuse is the granule of release.''&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Martin elaborates: &amp;quot;A reusable element, be it a component, a class, or a cluster of classes, cannot be&lt;br /&gt;
reused unless it is managed by a release system of some kind. Users will be unwilling&lt;br /&gt;
to use the element if they are forced to upgrade every time the author changes it.&lt;br /&gt;
Thus. even though the author has released a new version of his reusable element, he&lt;br /&gt;
must be willing to support and maintain older versions while his customers go about&lt;br /&gt;
the slow business of getting ready to upgrade. Thus, clients will refuse to reuse an element&lt;br /&gt;
unless the author promises to keep track of version numbers, and maintain old&lt;br /&gt;
versions for awhile.&lt;br /&gt;
Therefore, one criterion for grouping classes into packages is reuse. Since packages&lt;br /&gt;
are the unit of release, they are also the unit of reuse. Therefore architects would do&lt;br /&gt;
well to group reusable classes together into packages.&amp;quot; [1]&lt;br /&gt;
&lt;br /&gt;
=='''''Description'''''==&lt;br /&gt;
&lt;br /&gt;
Martin describes a &amp;quot;release system&amp;quot; in his concept, which refers to a system that is able to track versions of code as it is changed. This is also sometimes referred to as [http://en.wikipedia.org/wiki/Version_control version control]. Some common examples of version control are [http://en.wikipedia.org/wiki/Subversion_%28software%29 SVN], [http://en.wikipedia.org/wiki/Concurrent_Versions_System CVS] and [http://en.wikipedia.org/wiki/Cmvc CMVC].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Martin also states that customers are slow to upgrade newer versions of code. This is commonly true for several reasons, including fear of instability of software, internal process, management approvals, and downtime for software systems.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Another critical concept here is that Martin states clients will refuse to upgrade unless the author tracks version numbers. This is related to the previous concept, where a client or customer, because of the above factors, may need to revert the system to a previous version of the code because the new version has caused a problem or outage.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
REP has also been described in the following way:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;..in order to effectively reuse code it must arrive in a complete, black-box, package that is to be used but not changed. Users of the code are shielded from changes to it because they can choose when to integrate changes from the package into their own code. While this supports code ownership, and even promotes it, it does not enforce it.&amp;quot; [2]&lt;br /&gt;
&lt;br /&gt;
Further elaboration on REP is noted here:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;I reuse code if, and only if, I never need to look at&lt;br /&gt;
the [http://en.wikipedia.org/wiki/Source_code source code] (other than the public portions of header files). I need only link with static&lt;br /&gt;
[http://en.wikipedia.org/wiki/Library_%28computing%29 libraries] or include dynamic libraries. Whenever these libraries are fixed or enhanced, I&lt;br /&gt;
receive a new version which I can then integrate into my system when opportunity allows. That is, I expect the code I am reusing to be treated like a product. It is not maintained&lt;br /&gt;
by me. It is not distributed by me. I am the customer, and the author, or some other entity,&lt;br /&gt;
is responsible for maintaining it. Thus, I can reuse nothing that is not also released. Moreover, when I reuse something&lt;br /&gt;
in a released library, I am in effect a client of the entire library.&amp;quot;[3]&lt;br /&gt;
&lt;br /&gt;
In a nutshell, Martin is stating that reuse (not copying) is useless and meaningless without release. The concept of reuse is vital to elegant [http://en.wikipedia.org/wiki/Object_oriented_design Object-Oriented design] and therefore cannot be properly maintained without release.&lt;br /&gt;
&lt;br /&gt;
=='''''Advantages'''''==&lt;br /&gt;
&lt;br /&gt;
The obvious advantages of REP are:&lt;br /&gt;
&lt;br /&gt;
1. [http://en.wikipedia.org/wiki/Software_maintenance Maintainability]. There is no need to maintain reused code. This is done by the owner of the reused (released) code.&amp;lt;br&amp;gt;&lt;br /&gt;
2. Flexibility. The consumer of the reused code can decide what version and on what timetable the reused code is adopted.&amp;lt;br&amp;gt;&lt;br /&gt;
3. Enhancements. There is no need to make the reused code more efficient or to add function. New function can be added by upgrading to a new version of the reused code.&lt;br /&gt;
&lt;br /&gt;
=='''''Disadvantages'''''==&lt;br /&gt;
&lt;br /&gt;
As REP is a Cohesion Principle, the disadvantages would be similar to disadvantages of cohesion principles.&lt;br /&gt;
&lt;br /&gt;
1. REP is not simple for the maintainer of the code. The code owner must maintain several versions of the code, as well as large packages.&amp;lt;br&amp;gt;&lt;br /&gt;
2. The package structure cannot be designed from the top down, meaning that it would not be one of the first things about a system that is designed. Because of this, the package structure remains in a constant state of flux. [3]&amp;lt;br&amp;gt;&lt;br /&gt;
3. The best design philosophy cannot depend solely on REP. REP is best suited for a system that has gone through the initial planning, design and development stages to ensure that the package structure can be utilized effectively.&lt;br /&gt;
&lt;br /&gt;
=='''''Example'''''==&lt;br /&gt;
&lt;br /&gt;
The Java Boutique describes a [http://javaboutique.internet.com/Case_Study/ tutorial] for designing a system with, among other principles, REP.&lt;br /&gt;
&lt;br /&gt;
=='''''Conclusion'''''==&lt;br /&gt;
&lt;br /&gt;
Code should be reused by including the released library, not by copying the code. This ensures the reused code is maintained by a single authority to avoid the divergence of the reused code. In fact the user should never see the source code for reuse except the included header files - &amp;lt;b&amp;gt;The unit of reuse is the unit of release&amp;lt;/b&amp;gt; &lt;br /&gt;
&lt;br /&gt;
The users of the library need to know the version/signature for dependency control and for reliable reversal to the originals after failed upgrade. The author need the same information to maintain and support the released product - &amp;lt;b&amp;gt;Effective reuse requires a change control system&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Though a class is the &amp;lt;i&amp;gt;de facto&amp;lt;/i&amp;gt; unit of reuse, its reuse is mostly confined to the author who also authors related classes and collectively make them a large functional unit - package. The REP is targeting a broad range of audience who are more interested in reuse this large functional unit or a class in that context. Also keeping track of version of individual classes would be burdensome to both users who, more often than not, use multiple classes within the same package, and author who need to maintain individual classes and their inter-dependencies within the large functional unit. &amp;lt;b&amp;gt;The effective unit of reuse and release is the package&amp;lt;/B&amp;gt;&lt;br /&gt;
&lt;br /&gt;
REP not only applies to external users, but also applies within the organization among different development groups.&lt;br /&gt;
&lt;br /&gt;
=='''''References'''''==&lt;br /&gt;
&lt;br /&gt;
[1] Design Principles and Patterns: http://www.objectmentor.com/resources/articles/Principles_and_Patterns.pdf &amp;lt;br&amp;gt;&lt;br /&gt;
[2] Reuse Release Equivalence Principle: http://c2.com/cgi/wiki$?ReuseReleaseEquivalencePrinciple&amp;lt;br&amp;gt;&lt;br /&gt;
[3] Granularity: http://www.objectmentor.com/resources/articles/granularity.pdf&amp;lt;br&amp;gt;&lt;br /&gt;
[4] Object Oriented Software Construction, Bertrand Meyer, Prentice Hall, 1988&lt;/div&gt;</summary>
		<author><name>Discostu</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki3_teamhelm&amp;diff=29438</id>
		<title>CSC/ECE 517 Fall 2009/wiki3 teamhelm</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki3_teamhelm&amp;diff=29438"/>
		<updated>2009-11-19T03:01:08Z</updated>

		<summary type="html">&lt;p&gt;Discostu: /* '''''Example''''' */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''The Release Reuse Equivalency Principle (REP)''' ==&lt;br /&gt;
Components can be effectively reused only if they are released through a tracking system.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=='''''Concept'''''==&lt;br /&gt;
&lt;br /&gt;
The Release Reuse Equivalency Principle (REP), first introduced by [http://en.wikipedia.org/wiki/Robert_Cecil_Martin Bob Martin], is described as follows:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;''The granule of reuse is the granule of release.''&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Martin elaborates: &amp;quot;A reusable element, be it a component, a class, or a cluster of classes, cannot be&lt;br /&gt;
reused unless it is managed by a release system of some kind. Users will be unwilling&lt;br /&gt;
to use the element if they are forced to upgrade every time the author changes it.&lt;br /&gt;
Thus. even though the author has released a new version of his reusable element, he&lt;br /&gt;
must be willing to support and maintain older versions while his customers go about&lt;br /&gt;
the slow business of getting ready to upgrade. Thus, clients will refuse to reuse an element&lt;br /&gt;
unless the author promises to keep track of version numbers, and maintain old&lt;br /&gt;
versions for awhile.&lt;br /&gt;
Therefore, one criterion for grouping classes into packages is reuse. Since packages&lt;br /&gt;
are the unit of release, they are also the unit of reuse. Therefore architects would do&lt;br /&gt;
well to group reusable classes together into packages.&amp;quot; [1]&lt;br /&gt;
&lt;br /&gt;
=='''''Description'''''==&lt;br /&gt;
&lt;br /&gt;
Martin describes a &amp;quot;release system&amp;quot; in his concept, which refers to a system that is able to track versions of code as it is changed. This is also sometimes referred to as [http://en.wikipedia.org/wiki/Version_control version control]. Some common examples of version control are [http://en.wikipedia.org/wiki/Subversion_%28software%29 SVN], [http://en.wikipedia.org/wiki/Concurrent_Versions_System CVS] and [http://en.wikipedia.org/wiki/Cmvc CMVC].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Martin also states that customers are slow to upgrade newer versions of code. This is commonly true for several reasons, including fear of instability of software, internal process, management approvals, and downtime for software systems.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Another critical concept here is that Martin states clients will refuse to upgrade unless the author tracks version numbers. This is related to the previous concept, where a client or customer, because of the above factors, may need to revert the system to a previous version of the code because the new version has caused a problem or outage.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
REP has also been described in the following way:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;..in order to effectively reuse code it must arrive in a complete, black-box, package that is to be used but not changed. Users of the code are shielded from changes to it because they can choose when to integrate changes from the package into their own code. While this supports code ownership, and even promotes it, it does not enforce it.&amp;quot; [2]&lt;br /&gt;
&lt;br /&gt;
Further elaboration on REP is noted here:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;I reuse code if, and only if, I never need to look at&lt;br /&gt;
the [http://en.wikipedia.org/wiki/Source_code source code] (other than the public portions of header files). I need only link with static&lt;br /&gt;
[http://en.wikipedia.org/wiki/Library_%28computing%29 libraries] or include dynamic libraries. Whenever these libraries are fixed or enhanced, I&lt;br /&gt;
receive a new version which I can then integrate into my system when opportunity allows. That is, I expect the code I am reusing to be treated like a product. It is not maintained&lt;br /&gt;
by me. It is not distributed by me. I am the customer, and the author, or some other entity,&lt;br /&gt;
is responsible for maintaining it. Thus, I can reuse nothing that is not also released. Moreover, when I reuse something&lt;br /&gt;
in a released library, I am in effect a client of the entire library.&amp;quot;[3]&lt;br /&gt;
&lt;br /&gt;
In a nutshell, Martin is stating that reuse (not copying) is useless and meaningless without release. The concept of reuse is vital to elegant [http://en.wikipedia.org/wiki/Object_oriented_design Object-Oriented design] and therefore cannot be properly maintained without release.&lt;br /&gt;
&lt;br /&gt;
=='''''Advantages'''''==&lt;br /&gt;
&lt;br /&gt;
The obvious advantages of REP are:&lt;br /&gt;
&lt;br /&gt;
1. Maintainability. There is no need to maintain reused code. This is done by the owner of the resused (released) code.&amp;lt;br&amp;gt;&lt;br /&gt;
2. Flexibility. The consumer of the reused code can decide what version and on what timetable the reused code is adopted.&amp;lt;br&amp;gt;&lt;br /&gt;
3. Enhancements. There is no need to make the reused code more efficient or to add function. New function can be added by upgrading to a new version of the reused code.&lt;br /&gt;
&lt;br /&gt;
=='''''Disadvantages'''''==&lt;br /&gt;
&lt;br /&gt;
As REP is a Cohesion Principle, the disadvantages would be similar to disadvantages of cohesion principles.&lt;br /&gt;
&lt;br /&gt;
1. REP is not simple for the maintainer of the code. The code owner must maintain several versions of the code, as well as large packages.&amp;lt;br&amp;gt;&lt;br /&gt;
2. The package structure cannot be designed from the top down, meaning that it would not be one of the first things about a system that is designed. Because of this, the package structure remains in a constant state of flux. [3]&amp;lt;br&amp;gt;&lt;br /&gt;
3. The best design philosophy cannot depend solely on REP. REP is best suited for a system that has gone through the initial planning, design and development stages to ensure that the package structure can be utilized effectively.&lt;br /&gt;
&lt;br /&gt;
=='''''Example'''''==&lt;br /&gt;
&lt;br /&gt;
The Java Boutique describes a [http://javaboutique.internet.com/Case_Study/ tutorial] for designing a system with, among other principles, REP.&lt;br /&gt;
&lt;br /&gt;
=='''''Conclusion'''''==&lt;br /&gt;
&lt;br /&gt;
Code should be reused by including the released library, not by copying the code. This ensures the reused code is maintained by a single authority to avoid the divergence of the reused code. In fact the user should never see the source code for reuse except the included header files - &amp;lt;b&amp;gt;The unit of reuse is the unit of release&amp;lt;/b&amp;gt; &lt;br /&gt;
&lt;br /&gt;
The users of the library need to know the version/signature for dependency control and for reliable reversal to the originals after failed upgrade. The author need the same information to maintain and support the released product - &amp;lt;b&amp;gt;Effective reuse requires a change control system&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Though a class is the &amp;lt;i&amp;gt;de facto&amp;lt;/i&amp;gt; unit of reuse, its reuse is mostly confined to the author who also authors related classes and collectively make them a large functional unit - package. The REP is targeting a broad range of audience who are more interested in reuse this large functional unit or a class in that context. Also keeping track of version of individual classes would be burdensome to both users who, more often than not, use multiple classes within the same package, and author who need to maintain individual classes and their inter-dependencies within the large functional unit. &amp;lt;b&amp;gt;The effective unit of reuse and release is the package&amp;lt;/B&amp;gt;&lt;br /&gt;
&lt;br /&gt;
REP not only applies to external users, but also applies within the organization among different development groups.&lt;br /&gt;
&lt;br /&gt;
=='''''References'''''==&lt;br /&gt;
&lt;br /&gt;
[1] Design Principles and Patterns: http://www.objectmentor.com/resources/articles/Principles_and_Patterns.pdf &amp;lt;br&amp;gt;&lt;br /&gt;
[2] Reuse Release Equivalence Principle: http://c2.com/cgi/wiki$?ReuseReleaseEquivalencePrinciple&amp;lt;br&amp;gt;&lt;br /&gt;
[3] Granularity: http://www.objectmentor.com/resources/articles/granularity.pdf&amp;lt;br&amp;gt;&lt;br /&gt;
[4] Object Oriented Software Construction, Bertrand Meyer, Prentice Hall, 1988&lt;/div&gt;</summary>
		<author><name>Discostu</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki3_16_teamhelm&amp;diff=27717</id>
		<title>CSC/ECE 517 Fall 2009/wiki3 16 teamhelm</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki3_16_teamhelm&amp;diff=27717"/>
		<updated>2009-11-18T00:31:10Z</updated>

		<summary type="html">&lt;p&gt;Discostu: /* '''''Example''''' */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''The Release Reuse Equivalency Principle (REP)''' ==&lt;br /&gt;
Components can be effectively reused only if they are released through a tracking system.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=='''''Concept'''''==&lt;br /&gt;
&lt;br /&gt;
The Release Reuse Equivalency Principle (REP), first introduced by Bertrand Meyer [3][4], and later laid down in details by [http://en.wikipedia.org/wiki/Robert_Cecil_Martin Bob Martin], is described as follows:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;''The granule of reuse is the granule of release.''&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Martin elaborates: &amp;quot;A reusable element, be it a component, a class, or a cluster of classes, cannot be&lt;br /&gt;
reused unless it is managed by a release system of some kind. Users will be unwilling&lt;br /&gt;
to use the element if they are forced to upgrade every time the author changes it.&lt;br /&gt;
Thus. even though the author has released a new version of his reusable element, he&lt;br /&gt;
must be willing to support and maintain older versions while his customers go about&lt;br /&gt;
the slow business of getting ready to upgrade. Thus, clients will refuse to reuse an element&lt;br /&gt;
unless the author promises to keep track of version numbers, and maintain old&lt;br /&gt;
versions for awhile.&lt;br /&gt;
Therefore, one criterion for grouping classes into packages is reuse. Since packages&lt;br /&gt;
are the unit of release, they are also the unit of reuse. Therefore architects would do&lt;br /&gt;
well to group reusable classes together into packages.&amp;quot; [1]&lt;br /&gt;
&lt;br /&gt;
=='''''Description'''''==&lt;br /&gt;
&lt;br /&gt;
Martin describes a &amp;quot;release system&amp;quot; in his concept, which refers to a system that is able to track versions of code as it is changed. This is also sometimes referred to as [http://en.wikipedia.org/wiki/Version_control version control]. Some common examples of version control are [http://en.wikipedia.org/wiki/Subversion_%28software%29 SVN], [http://en.wikipedia.org/wiki/Concurrent_Versions_System CVS] and [http://en.wikipedia.org/wiki/Cmvc CMVC].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Martin also states that customers are slow to upgrade newer versions of code. This is commonly true for several reasons, including fear of instability of software, internal process, management approvals, and downtime for software systems.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Another critical concept here is that Martin states clients will refuse to upgrade unless the author tracks version numbers. This is related to the previous concept, where a client or customer, because of the above factors, may need to revert the system to a previous version of the code because the new version has caused a problem or outage.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
REP has also been described in the following way:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;..in order to effectively reuse code it must arrive in a complete, black-box, package that is to be used but not changed. Users of the code are shielded from changes to it because they can choose when to integrate changes from the package into their own code. While this supports code ownership, and even promotes it, it does not enforce it.&amp;quot; [2]&lt;br /&gt;
&lt;br /&gt;
Further elaboration on REP is noted here:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;I reuse code if, and only if, I never need to look at&lt;br /&gt;
the [http://en.wikipedia.org/wiki/Source_code source code] (other than the public portions of header files). I need only link with static&lt;br /&gt;
[http://en.wikipedia.org/wiki/Library_%28computing%29 libraries] or include dynamic libraries. Whenever these libraries are fixed or enhanced, I&lt;br /&gt;
receive a new version which I can then integrate into my system when opportunity allows. That is, I expect the code I am reusing to be treated like a product. It is not maintained&lt;br /&gt;
by me. It is not distributed by me. I am the customer, and the author, or some other entity,&lt;br /&gt;
is responsible for maintaining it. Thus, I can reuse nothing that is not also released. Moreover, when I reuse something&lt;br /&gt;
in a released library, I am in effect a client of the entire library.&amp;quot;[3]&lt;br /&gt;
&lt;br /&gt;
In a nutshell, Martin is stating that reuse (not copying) is useless and meaningless without release. The concept of reuse is vital to elegant [http://en.wikipedia.org/wiki/Object_oriented_design Object-Oriented design] and therefore cannot be properly maintained without release.&lt;br /&gt;
&lt;br /&gt;
=='''''Advantages'''''==&lt;br /&gt;
&lt;br /&gt;
The obvious advantages of REP are:&lt;br /&gt;
&lt;br /&gt;
1. Maintainability. There is no need to maintain reused code. This is done by the owner of the resused (released) code.&amp;lt;br&amp;gt;&lt;br /&gt;
2. Flexibility. The consumer of the reused code can decide what version and on what timetable the reused code is adopted.&amp;lt;br&amp;gt;&lt;br /&gt;
3. Enhancements. There is no need to make the reused code more efficient or to add function. New function can be added by upgrading to a new version of the reused code.&lt;br /&gt;
&lt;br /&gt;
=='''''Disadvantages'''''==&lt;br /&gt;
&lt;br /&gt;
As REP is a Cohesion Principle, the disadvantages would be similar to disadvantages of cohesion principles.&lt;br /&gt;
&lt;br /&gt;
1. REP is not simple for the maintainer of the code. The code owner must maintain several versions of the code, as well as large packages.&amp;lt;br&amp;gt;&lt;br /&gt;
2. The package structure cannot be designed from the top down, meaning that it would not be one of the first things about a system that is designed. Because of this, the package structure remains in a constant state of flux. [3]&amp;lt;br&amp;gt;&lt;br /&gt;
3. The best design philosophy cannot depend solely on REP. REP is best suited for a system that has gone through the initial planning, design and development stages to ensure that the package structure can be utilized effectively.&lt;br /&gt;
&lt;br /&gt;
=='''''Example'''''==&lt;br /&gt;
&lt;br /&gt;
The Java Boutique desribes a [http://javaboutique.internet.com/Case_Study/ tutorial] for designing a system with, among other primciples, REP in mind.&lt;br /&gt;
&lt;br /&gt;
A &amp;quot;bad&amp;quot; example of not following REP is to reuse code by copying the source code. Just a few days after Microsoft released its Windows 7 operating system, it had to apologize to the public for violating the [http://en.wikipedia.org/wiki/Gpl GPL] license.[5] A utility tool it hired the third party to develop contains a chunk of open source code with a [http://en.wikipedia.org/wiki/Gpl GPL] license attached to it. Microsoft had to open its own source code for this utility program.&lt;br /&gt;
&lt;br /&gt;
=='''''Conclusion'''''==&lt;br /&gt;
&lt;br /&gt;
Code should be reused by including the released library, not by copying the code. This ensures the reused code is maintained by a single authority to avoid the divergence of the reused code. In fact the user should never see the source code for reuse except the included header files - &amp;lt;b&amp;gt;The unit of reuse is the unit of release&amp;lt;/b&amp;gt; &lt;br /&gt;
&lt;br /&gt;
The users of the library need to know the version for dependency control and for reliable reversal to the originals after failed upgrade. The author need the same information to maintain and support the released product - &amp;lt;b&amp;gt;Effective reuse requires a change control system&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Though a class is the &amp;lt;i&amp;gt;de facto&amp;lt;/i&amp;gt; unit of reuse, its reuse is mostly confined to the author who also authors related classes and collectively make them a large functional unit - package. The REP is targeting a broad range of audience who are more interested in reuse this large functional unit or a class in that context. Also keeping track of version of individual classes would be burdensome to both the users who, more often than not, use multiple classes within the same package, and the author who need to maintain individual classes and their inter-dependencies within the large functional unit. &amp;lt;b&amp;gt;The effective unit of reuse and release is the package&amp;lt;/B&amp;gt;&lt;br /&gt;
&lt;br /&gt;
REP not only applies to external users, but also applies within the organization among different development groups.&lt;br /&gt;
&lt;br /&gt;
=='''''References'''''==&lt;br /&gt;
&lt;br /&gt;
[1] Design Principles and Patterns: http://www.objectmentor.com/resources/articles/Principles_and_Patterns.pdf &amp;lt;br&amp;gt;&lt;br /&gt;
[2] Reuse Release Equivalence Principle: http://c2.com/cgi/wiki$?ReuseReleaseEquivalencePrinciple&amp;lt;br&amp;gt;&lt;br /&gt;
[3] Granularity: http://www.objectmentor.com/resources/articles/granularity.pdf&amp;lt;br&amp;gt;&lt;br /&gt;
[4] Object Oriented Software Construction, Bertrand Meyer, Prentice Hall, 1988&amp;lt;br&amp;gt;&lt;br /&gt;
[5] Microsoft will open source Windows 7 tool that includes GPL code: http://www.infoworld.com/d/windows/microsoft-will-open-source-windows-7-tool-includes-gpl-code-442&lt;/div&gt;</summary>
		<author><name>Discostu</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki3_16_teamhelm&amp;diff=27716</id>
		<title>CSC/ECE 517 Fall 2009/wiki3 16 teamhelm</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki3_16_teamhelm&amp;diff=27716"/>
		<updated>2009-11-18T00:30:28Z</updated>

		<summary type="html">&lt;p&gt;Discostu: /* '''''References''''' */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''The Release Reuse Equivalency Principle (REP)''' ==&lt;br /&gt;
Components can be effectively reused only if they are released through a tracking system.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=='''''Concept'''''==&lt;br /&gt;
&lt;br /&gt;
The Release Reuse Equivalency Principle (REP), first introduced by Bertrand Meyer [3][4], and later laid down in details by [http://en.wikipedia.org/wiki/Robert_Cecil_Martin Bob Martin], is described as follows:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;''The granule of reuse is the granule of release.''&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Martin elaborates: &amp;quot;A reusable element, be it a component, a class, or a cluster of classes, cannot be&lt;br /&gt;
reused unless it is managed by a release system of some kind. Users will be unwilling&lt;br /&gt;
to use the element if they are forced to upgrade every time the author changes it.&lt;br /&gt;
Thus. even though the author has released a new version of his reusable element, he&lt;br /&gt;
must be willing to support and maintain older versions while his customers go about&lt;br /&gt;
the slow business of getting ready to upgrade. Thus, clients will refuse to reuse an element&lt;br /&gt;
unless the author promises to keep track of version numbers, and maintain old&lt;br /&gt;
versions for awhile.&lt;br /&gt;
Therefore, one criterion for grouping classes into packages is reuse. Since packages&lt;br /&gt;
are the unit of release, they are also the unit of reuse. Therefore architects would do&lt;br /&gt;
well to group reusable classes together into packages.&amp;quot; [1]&lt;br /&gt;
&lt;br /&gt;
=='''''Description'''''==&lt;br /&gt;
&lt;br /&gt;
Martin describes a &amp;quot;release system&amp;quot; in his concept, which refers to a system that is able to track versions of code as it is changed. This is also sometimes referred to as [http://en.wikipedia.org/wiki/Version_control version control]. Some common examples of version control are [http://en.wikipedia.org/wiki/Subversion_%28software%29 SVN], [http://en.wikipedia.org/wiki/Concurrent_Versions_System CVS] and [http://en.wikipedia.org/wiki/Cmvc CMVC].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Martin also states that customers are slow to upgrade newer versions of code. This is commonly true for several reasons, including fear of instability of software, internal process, management approvals, and downtime for software systems.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Another critical concept here is that Martin states clients will refuse to upgrade unless the author tracks version numbers. This is related to the previous concept, where a client or customer, because of the above factors, may need to revert the system to a previous version of the code because the new version has caused a problem or outage.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
REP has also been described in the following way:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;..in order to effectively reuse code it must arrive in a complete, black-box, package that is to be used but not changed. Users of the code are shielded from changes to it because they can choose when to integrate changes from the package into their own code. While this supports code ownership, and even promotes it, it does not enforce it.&amp;quot; [2]&lt;br /&gt;
&lt;br /&gt;
Further elaboration on REP is noted here:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;I reuse code if, and only if, I never need to look at&lt;br /&gt;
the [http://en.wikipedia.org/wiki/Source_code source code] (other than the public portions of header files). I need only link with static&lt;br /&gt;
[http://en.wikipedia.org/wiki/Library_%28computing%29 libraries] or include dynamic libraries. Whenever these libraries are fixed or enhanced, I&lt;br /&gt;
receive a new version which I can then integrate into my system when opportunity allows. That is, I expect the code I am reusing to be treated like a product. It is not maintained&lt;br /&gt;
by me. It is not distributed by me. I am the customer, and the author, or some other entity,&lt;br /&gt;
is responsible for maintaining it. Thus, I can reuse nothing that is not also released. Moreover, when I reuse something&lt;br /&gt;
in a released library, I am in effect a client of the entire library.&amp;quot;[3]&lt;br /&gt;
&lt;br /&gt;
In a nutshell, Martin is stating that reuse (not copying) is useless and meaningless without release. The concept of reuse is vital to elegant [http://en.wikipedia.org/wiki/Object_oriented_design Object-Oriented design] and therefore cannot be properly maintained without release.&lt;br /&gt;
&lt;br /&gt;
=='''''Advantages'''''==&lt;br /&gt;
&lt;br /&gt;
The obvious advantages of REP are:&lt;br /&gt;
&lt;br /&gt;
1. Maintainability. There is no need to maintain reused code. This is done by the owner of the resused (released) code.&amp;lt;br&amp;gt;&lt;br /&gt;
2. Flexibility. The consumer of the reused code can decide what version and on what timetable the reused code is adopted.&amp;lt;br&amp;gt;&lt;br /&gt;
3. Enhancements. There is no need to make the reused code more efficient or to add function. New function can be added by upgrading to a new version of the reused code.&lt;br /&gt;
&lt;br /&gt;
=='''''Disadvantages'''''==&lt;br /&gt;
&lt;br /&gt;
As REP is a Cohesion Principle, the disadvantages would be similar to disadvantages of cohesion principles.&lt;br /&gt;
&lt;br /&gt;
1. REP is not simple for the maintainer of the code. The code owner must maintain several versions of the code, as well as large packages.&amp;lt;br&amp;gt;&lt;br /&gt;
2. The package structure cannot be designed from the top down, meaning that it would not be one of the first things about a system that is designed. Because of this, the package structure remains in a constant state of flux. [3]&amp;lt;br&amp;gt;&lt;br /&gt;
3. The best design philosophy cannot depend solely on REP. REP is best suited for a system that has gone through the initial planning, design and development stages to ensure that the package structure can be utilized effectively.&lt;br /&gt;
&lt;br /&gt;
=='''''Example'''''==&lt;br /&gt;
&lt;br /&gt;
The Java Boutique desribes a [http://javaboutique.internet.com/Case_Study/ tutorial] for designing a system with, among other primciples, REP in mind.&lt;br /&gt;
&lt;br /&gt;
A &amp;quot;bad&amp;quot; example of not following REP is to reuse code by copying the source code. Just a few days after Microsoft released its Windows 7 operating system, it had to apologize to the public for violating the [http://en.wikipedia.org/wiki/Gpl GPL] license.[5] A utility tool it hired the third party to develop contains a chunk of open source code with a [http://en.wikipedia.org/wiki/Gpl GPL] license attached to it. Microsoft had to endure the public humiliation and was &amp;quot;forced&amp;quot; to open its own source code for this utility program.&lt;br /&gt;
&lt;br /&gt;
=='''''Conclusion'''''==&lt;br /&gt;
&lt;br /&gt;
Code should be reused by including the released library, not by copying the code. This ensures the reused code is maintained by a single authority to avoid the divergence of the reused code. In fact the user should never see the source code for reuse except the included header files - &amp;lt;b&amp;gt;The unit of reuse is the unit of release&amp;lt;/b&amp;gt; &lt;br /&gt;
&lt;br /&gt;
The users of the library need to know the version for dependency control and for reliable reversal to the originals after failed upgrade. The author need the same information to maintain and support the released product - &amp;lt;b&amp;gt;Effective reuse requires a change control system&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Though a class is the &amp;lt;i&amp;gt;de facto&amp;lt;/i&amp;gt; unit of reuse, its reuse is mostly confined to the author who also authors related classes and collectively make them a large functional unit - package. The REP is targeting a broad range of audience who are more interested in reuse this large functional unit or a class in that context. Also keeping track of version of individual classes would be burdensome to both the users who, more often than not, use multiple classes within the same package, and the author who need to maintain individual classes and their inter-dependencies within the large functional unit. &amp;lt;b&amp;gt;The effective unit of reuse and release is the package&amp;lt;/B&amp;gt;&lt;br /&gt;
&lt;br /&gt;
REP not only applies to external users, but also applies within the organization among different development groups.&lt;br /&gt;
&lt;br /&gt;
=='''''References'''''==&lt;br /&gt;
&lt;br /&gt;
[1] Design Principles and Patterns: http://www.objectmentor.com/resources/articles/Principles_and_Patterns.pdf &amp;lt;br&amp;gt;&lt;br /&gt;
[2] Reuse Release Equivalence Principle: http://c2.com/cgi/wiki$?ReuseReleaseEquivalencePrinciple&amp;lt;br&amp;gt;&lt;br /&gt;
[3] Granularity: http://www.objectmentor.com/resources/articles/granularity.pdf&amp;lt;br&amp;gt;&lt;br /&gt;
[4] Object Oriented Software Construction, Bertrand Meyer, Prentice Hall, 1988&amp;lt;br&amp;gt;&lt;br /&gt;
[5] Microsoft will open source Windows 7 tool that includes GPL code: http://www.infoworld.com/d/windows/microsoft-will-open-source-windows-7-tool-includes-gpl-code-442&lt;/div&gt;</summary>
		<author><name>Discostu</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki3_16_teamhelm&amp;diff=27713</id>
		<title>CSC/ECE 517 Fall 2009/wiki3 16 teamhelm</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki3_16_teamhelm&amp;diff=27713"/>
		<updated>2009-11-18T00:26:25Z</updated>

		<summary type="html">&lt;p&gt;Discostu: /* '''''Example''''' */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''The Release Reuse Equivalency Principle (REP)''' ==&lt;br /&gt;
Components can be effectively reused only if they are released through a tracking system.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=='''''Concept'''''==&lt;br /&gt;
&lt;br /&gt;
The Release Reuse Equivalency Principle (REP), first introduced by Bertrand Meyer [3][4], and later laid down in details by [http://en.wikipedia.org/wiki/Robert_Cecil_Martin Bob Martin], is described as follows:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;''The granule of reuse is the granule of release.''&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Martin elaborates: &amp;quot;A reusable element, be it a component, a class, or a cluster of classes, cannot be&lt;br /&gt;
reused unless it is managed by a release system of some kind. Users will be unwilling&lt;br /&gt;
to use the element if they are forced to upgrade every time the author changes it.&lt;br /&gt;
Thus. even though the author has released a new version of his reusable element, he&lt;br /&gt;
must be willing to support and maintain older versions while his customers go about&lt;br /&gt;
the slow business of getting ready to upgrade. Thus, clients will refuse to reuse an element&lt;br /&gt;
unless the author promises to keep track of version numbers, and maintain old&lt;br /&gt;
versions for awhile.&lt;br /&gt;
Therefore, one criterion for grouping classes into packages is reuse. Since packages&lt;br /&gt;
are the unit of release, they are also the unit of reuse. Therefore architects would do&lt;br /&gt;
well to group reusable classes together into packages.&amp;quot; [1]&lt;br /&gt;
&lt;br /&gt;
=='''''Description'''''==&lt;br /&gt;
&lt;br /&gt;
Martin describes a &amp;quot;release system&amp;quot; in his concept, which refers to a system that is able to track versions of code as it is changed. This is also sometimes referred to as [http://en.wikipedia.org/wiki/Version_control version control]. Some common examples of version control are [http://en.wikipedia.org/wiki/Subversion_%28software%29 SVN], [http://en.wikipedia.org/wiki/Concurrent_Versions_System CVS] and [http://en.wikipedia.org/wiki/Cmvc CMVC].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Martin also states that customers are slow to upgrade newer versions of code. This is commonly true for several reasons, including fear of instability of software, internal process, management approvals, and downtime for software systems.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Another critical concept here is that Martin states clients will refuse to upgrade unless the author tracks version numbers. This is related to the previous concept, where a client or customer, because of the above factors, may need to revert the system to a previous version of the code because the new version has caused a problem or outage.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
REP has also been described in the following way:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;..in order to effectively reuse code it must arrive in a complete, black-box, package that is to be used but not changed. Users of the code are shielded from changes to it because they can choose when to integrate changes from the package into their own code. While this supports code ownership, and even promotes it, it does not enforce it.&amp;quot; [2]&lt;br /&gt;
&lt;br /&gt;
Further elaboration on REP is noted here:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;I reuse code if, and only if, I never need to look at&lt;br /&gt;
the [http://en.wikipedia.org/wiki/Source_code source code] (other than the public portions of header files). I need only link with static&lt;br /&gt;
[http://en.wikipedia.org/wiki/Library_%28computing%29 libraries] or include dynamic libraries. Whenever these libraries are fixed or enhanced, I&lt;br /&gt;
receive a new version which I can then integrate into my system when opportunity allows. That is, I expect the code I am reusing to be treated like a product. It is not maintained&lt;br /&gt;
by me. It is not distributed by me. I am the customer, and the author, or some other entity,&lt;br /&gt;
is responsible for maintaining it. Thus, I can reuse nothing that is not also released. Moreover, when I reuse something&lt;br /&gt;
in a released library, I am in effect a client of the entire library.&amp;quot;[3]&lt;br /&gt;
&lt;br /&gt;
In a nutshell, Martin is stating that reuse (not copying) is useless and meaningless without release. The concept of reuse is vital to elegant [http://en.wikipedia.org/wiki/Object_oriented_design Object-Oriented design] and therefore cannot be properly maintained without release.&lt;br /&gt;
&lt;br /&gt;
=='''''Advantages'''''==&lt;br /&gt;
&lt;br /&gt;
The obvious advantages of REP are:&lt;br /&gt;
&lt;br /&gt;
1. Maintainability. There is no need to maintain reused code. This is done by the owner of the resused (released) code.&amp;lt;br&amp;gt;&lt;br /&gt;
2. Flexibility. The consumer of the reused code can decide what version and on what timetable the reused code is adopted.&amp;lt;br&amp;gt;&lt;br /&gt;
3. Enhancements. There is no need to make the reused code more efficient or to add function. New function can be added by upgrading to a new version of the reused code.&lt;br /&gt;
&lt;br /&gt;
=='''''Disadvantages'''''==&lt;br /&gt;
&lt;br /&gt;
As REP is a Cohesion Principle, the disadvantages would be similar to disadvantages of cohesion principles.&lt;br /&gt;
&lt;br /&gt;
1. REP is not simple for the maintainer of the code. The code owner must maintain several versions of the code, as well as large packages.&amp;lt;br&amp;gt;&lt;br /&gt;
2. The package structure cannot be designed from the top down, meaning that it would not be one of the first things about a system that is designed. Because of this, the package structure remains in a constant state of flux. [3]&amp;lt;br&amp;gt;&lt;br /&gt;
3. The best design philosophy cannot depend solely on REP. REP is best suited for a system that has gone through the initial planning, design and development stages to ensure that the package structure can be utilized effectively.&lt;br /&gt;
&lt;br /&gt;
=='''''Example'''''==&lt;br /&gt;
&lt;br /&gt;
The Java Boutique desribes a [http://javaboutique.internet.com/Case_Study/ tutorial] for designing a system with, among other primciples, REP in mind.&lt;br /&gt;
&lt;br /&gt;
A &amp;quot;bad&amp;quot; example of not following REP is to reuse code by copying the source code. Just a few days after Microsoft released its Windows 7 operating system, it had to apologize to the public for violating the [http://en.wikipedia.org/wiki/Gpl GPL] license.[5] A utility tool it hired the third party to develop contains a chunk of open source code with a [http://en.wikipedia.org/wiki/Gpl GPL] license attached to it. Microsoft had to endure the public humiliation and was &amp;quot;forced&amp;quot; to open its own source code for this utility program.&lt;br /&gt;
&lt;br /&gt;
=='''''Conclusion'''''==&lt;br /&gt;
&lt;br /&gt;
Code should be reused by including the released library, not by copying the code. This ensures the reused code is maintained by a single authority to avoid the divergence of the reused code. In fact the user should never see the source code for reuse except the included header files - &amp;lt;b&amp;gt;The unit of reuse is the unit of release&amp;lt;/b&amp;gt; &lt;br /&gt;
&lt;br /&gt;
The users of the library need to know the version for dependency control and for reliable reversal to the originals after failed upgrade. The author need the same information to maintain and support the released product - &amp;lt;b&amp;gt;Effective reuse requires a change control system&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Though a class is the &amp;lt;i&amp;gt;de facto&amp;lt;/i&amp;gt; unit of reuse, its reuse is mostly confined to the author who also authors related classes and collectively make them a large functional unit - package. The REP is targeting a broad range of audience who are more interested in reuse this large functional unit or a class in that context. Also keeping track of version of individual classes would be burdensome to both the users who, more often than not, use multiple classes within the same package, and the author who need to maintain individual classes and their inter-dependencies within the large functional unit. &amp;lt;b&amp;gt;The effective unit of reuse and release is the package&amp;lt;/B&amp;gt;&lt;br /&gt;
&lt;br /&gt;
REP not only applies to external users, but also applies within the organization among different development groups.&lt;br /&gt;
&lt;br /&gt;
=='''''References'''''==&lt;br /&gt;
&lt;br /&gt;
[1] Design Principles and Patterns: http://www.objectmentor.com/resources/articles/Principles_and_Patterns.pdf &amp;lt;br&amp;gt;&lt;br /&gt;
[2] Reuse Release Equivalence Principle: http://c2.com/cgi/wiki$?ReuseReleaseEquivalencePrinciple&amp;lt;br&amp;gt;&lt;br /&gt;
[3] Granularity: http://www.objectmentor.com/resources/articles/granularity.pdf&amp;lt;br&amp;gt;&lt;br /&gt;
[4] Object Oriented Software Construction, Bertrand Meyer, Prentice Hall, 1988&lt;/div&gt;</summary>
		<author><name>Discostu</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki3teamhelm&amp;diff=27266</id>
		<title>CSC/ECE 517 Fall 2009/wiki3teamhelm</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki3teamhelm&amp;diff=27266"/>
		<updated>2009-11-17T12:49:34Z</updated>

		<summary type="html">&lt;p&gt;Discostu: CSC/ECE 517 Fall 2009/wiki3teamhelm moved to CSC/ECE 517 Fall 2009/wiki3 teamhelm: conform to dr gehringer's naming conventions&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[CSC/ECE 517 Fall 2009/wiki3 teamhelm]]&lt;/div&gt;</summary>
		<author><name>Discostu</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki3_teamhelm&amp;diff=27265</id>
		<title>CSC/ECE 517 Fall 2009/wiki3 teamhelm</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki3_teamhelm&amp;diff=27265"/>
		<updated>2009-11-17T12:49:34Z</updated>

		<summary type="html">&lt;p&gt;Discostu: CSC/ECE 517 Fall 2009/wiki3teamhelm moved to CSC/ECE 517 Fall 2009/wiki3 teamhelm: conform to dr gehringer's naming conventions&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''The Release Reuse Equivalency Principle (REP)''' ==&lt;br /&gt;
Components can be effectively reused only if they are released through a tracking system.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=='''''Concept'''''==&lt;br /&gt;
&lt;br /&gt;
The Release Reuse Equivalency Principle (REP), first introduced by [http://en.wikipedia.org/wiki/Robert_Cecil_Martin Bob Martin], is described as follows:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;''The granule of reuse is the granule of release.''&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Martin elaborates: &amp;quot;A reusable element, be it a component, a class, or a cluster of classes, cannot be&lt;br /&gt;
reused unless it is managed by a release system of some kind. Users will be unwilling&lt;br /&gt;
to use the element if they are forced to upgrade every time the author changes it.&lt;br /&gt;
Thus. even though the author has released a new version of his reusable element, he&lt;br /&gt;
must be willing to support and maintain older versions while his customers go about&lt;br /&gt;
the slow business of getting ready to upgrade. Thus, clients will refuse to reuse an element&lt;br /&gt;
unless the author promises to keep track of version numbers, and maintain old&lt;br /&gt;
versions for awhile.&lt;br /&gt;
Therefore, one criterion for grouping classes into packages is reuse. Since packages&lt;br /&gt;
are the unit of release, they are also the unit of reuse. Therefore architects would do&lt;br /&gt;
well to group reusable classes together into packages.&amp;quot; [1]&lt;br /&gt;
&lt;br /&gt;
=='''''Description'''''==&lt;br /&gt;
&lt;br /&gt;
Martin describes a &amp;quot;release system&amp;quot; in his concept, which refers to a system that is able to track versions of code as it is changed. This is also sometimes referred to as [http://en.wikipedia.org/wiki/Version_control version control]. Some common examples of version control are [http://en.wikipedia.org/wiki/Subversion_%28software%29 SVN], [http://en.wikipedia.org/wiki/Concurrent_Versions_System CVS] and [http://en.wikipedia.org/wiki/Cmvc CMVC].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Martin also states that customers are slow to upgrade newer versions of code. This is commonly true for several reasons, including fear of instability of software, internal process, management approvals, and downtime for software systems.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Another critical concept here is that Martin states clients will refuse to upgrade unless the author tracks version numbers. This is related to the previous concept, where a client or customer, because of the above factors, may need to revert the system to a previous version of the code because the new version has caused a problem or outage.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
REP has also been described in the following way:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;..in order to effectively reuse code it must arrive in a complete, black-box, package that is to be used but not changed. Users of the code are shielded from changes to it because they can choose when to integrate changes from the package into their own code. While this supports code ownership, and even promotes it, it does not enforce it.&amp;quot; [2]&lt;br /&gt;
&lt;br /&gt;
Further elaboration on REP is noted here:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;I reuse code if, and only if, I never need to look at&lt;br /&gt;
the [http://en.wikipedia.org/wiki/Source_code source code] (other than the public portions of header files). I need only link with static&lt;br /&gt;
[http://en.wikipedia.org/wiki/Library_%28computing%29 libraries] or include dynamic libraries. Whenever these libraries are fixed or enhanced, I&lt;br /&gt;
receive a new version which I can then integrate into my system when opportunity allows. That is, I expect the code I am reusing to be treated like a product. It is not maintained&lt;br /&gt;
by me. It is not distributed by me. I am the customer, and the author, or some other entity,&lt;br /&gt;
is responsible for maintaining it. Thus, I can reuse nothing that is not also released. Moreover, when I reuse something&lt;br /&gt;
in a released library, I am in effect a client of the entire library.&amp;quot;[3]&lt;br /&gt;
&lt;br /&gt;
In a nutshell, Martin is stating that reuse (not copying) is useless and meaningless without release. The concept of reuse is vital to elegant [http://en.wikipedia.org/wiki/Object_oriented_design Object-Oriented design] and therefore cannot be properly maintained without release.&lt;br /&gt;
&lt;br /&gt;
=='''''Advantages'''''==&lt;br /&gt;
&lt;br /&gt;
The obvious advantages of REP are:&lt;br /&gt;
&lt;br /&gt;
1. Maintainability. There is no need to maintain reused code. This is done by the owner of the resused (released) code.&amp;lt;br&amp;gt;&lt;br /&gt;
2. Flexibility. The consumer of the reused code can decide what version and on what timetable the reused code is adopted.&amp;lt;br&amp;gt;&lt;br /&gt;
3. Enhancements. There is no need to make the reused code more efficient or to add function. New function can be added by upgrading to a new version of the reused code.&lt;br /&gt;
&lt;br /&gt;
=='''''Disadvantages'''''==&lt;br /&gt;
&lt;br /&gt;
As REP is a Cohesion Principle, the disadvantages would be similar to disadvantages of cohesion principles.&lt;br /&gt;
&lt;br /&gt;
1. REP is not simple for the maintainer of the code. The code owner must maintain several versions of the code, as well as large packages.&amp;lt;br&amp;gt;&lt;br /&gt;
2. The package structure cannot be designed from the top down, meaning that it would not be one of the first things about a system that is designed. Because of this, the package structure remains in a constant state of flux. [3]&amp;lt;br&amp;gt;&lt;br /&gt;
3. The best design philosophy cannot depend solely on REP. REP is best suited for a system that has gone through the initial planning, design and development stages to ensure that the package structure can be utilized effectively.&lt;br /&gt;
&lt;br /&gt;
=='''''Example'''''==&lt;br /&gt;
&lt;br /&gt;
The Java Boutique desribes a [http://javaboutique.internet.com/Case_Study/ tutorial] for designing a system with, among other primciples, REP in mind.&lt;br /&gt;
&lt;br /&gt;
=='''''Conclusion'''''==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''References'''''&lt;br /&gt;
&lt;br /&gt;
[1] Design Principles and Patterns: http://www.objectmentor.com/resources/articles/Principles_and_Patterns.pdf &amp;lt;br&amp;gt;&lt;br /&gt;
[2] Reuse Release Equivalence Principle: http://c2.com/cgi/wiki$?ReuseReleaseEquivalencePrinciple&amp;lt;br&amp;gt;&lt;br /&gt;
[3] Granularity: http://www.objectmentor.com/resources/articles/granularity.pdf&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Discostu</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki3_teamhelm&amp;diff=27194</id>
		<title>CSC/ECE 517 Fall 2009/wiki3 teamhelm</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki3_teamhelm&amp;diff=27194"/>
		<updated>2009-11-17T02:26:56Z</updated>

		<summary type="html">&lt;p&gt;Discostu: /* '''''Example''''' */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''The Release Reuse Equivalency Principle (REP)''' ==&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=='''''Concept'''''==&lt;br /&gt;
&lt;br /&gt;
The Release Reuse Equivalency Principle (REP), first introduced by [http://en.wikipedia.org/wiki/Robert_Cecil_Martin Bob Martin], is described as follows:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;''The granule of reuse is the granule of release.''&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Martin elaborates: &amp;quot;A reusable element, be it a component, a class, or a cluster of classes, cannot be&lt;br /&gt;
reused unless it is managed by a release system of some kind. Users will be unwilling&lt;br /&gt;
to use the element if they are forced to upgrade every time the author changes it.&lt;br /&gt;
Thus. even though the author has released a new version of his reusable element, he&lt;br /&gt;
must be willing to support and maintain older versions while his customers go about&lt;br /&gt;
the slow business of getting ready to upgrade. Thus, clients will refuse to reuse an element&lt;br /&gt;
unless the author promises to keep track of version numbers, and maintain old&lt;br /&gt;
versions for awhile.&lt;br /&gt;
Therefore, one criterion for grouping classes into packages is reuse. Since packages&lt;br /&gt;
are the unit of release, they are also the unit of reuse. Therefore architects would do&lt;br /&gt;
well to group reusable classes together into packages.&amp;quot; [1]&lt;br /&gt;
&lt;br /&gt;
=='''''Description'''''==&lt;br /&gt;
&lt;br /&gt;
Martin describes a &amp;quot;release system&amp;quot; in his concept, which refers to a system that is able to track versions of code as it is changed. This is also sometimes referred to as [http://en.wikipedia.org/wiki/Version_control version control]. Some common examples of version control are [http://en.wikipedia.org/wiki/Subversion_%28software%29 SVN], [http://en.wikipedia.org/wiki/Concurrent_Versions_System CVS] and [http://en.wikipedia.org/wiki/Cmvc CMVC].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Martin also states that customers are slow to upgrade newer versions of code. This is commonly true for several reasons, including fear of instability of software, internal process, management approvals, and downtime for software systems.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Another critical concept here is that Martin states clients will refuse to upgrade unless the author tracks version numbers. This is related to the previous concept, where a client or customer, because of the above factors, may need to revert the system to a previous version of the code because the new version has caused a problem or outage.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
REP has also been described in the following way:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;..in order to effectively reuse code it must arrive in a complete, black-box, package that is to be used but not changed. Users of the code are shielded from changes to it because they can choose when to integrate changes from the package into their own code. While this supports code ownership, and even promotes it, it does not enforce it.&amp;quot; [2]&lt;br /&gt;
&lt;br /&gt;
Further elaboration on REP is noted here:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;I reuse code if, and only if, I never need to look at&lt;br /&gt;
the [http://en.wikipedia.org/wiki/Source_code source code] (other than the public portions of header files). I need only link with static&lt;br /&gt;
[http://en.wikipedia.org/wiki/Library_%28computing%29 libraries] or include dynamic libraries. Whenever these libraries are fixed or enhanced, I&lt;br /&gt;
receive a new version which I can then integrate into my system when opportunity allows. That is, I expect the code I am reusing to be treated like a product. It is not maintained&lt;br /&gt;
by me. It is not distributed by me. I am the customer, and the author, or some other entity,&lt;br /&gt;
is responsible for maintaining it. Thus, I can reuse nothing that is not also released. Moreover, when I reuse something&lt;br /&gt;
in a released library, I am in effect a client of the entire library.&amp;quot;[3]&lt;br /&gt;
&lt;br /&gt;
In a nutshell, Martin is stating that reuse (not copying) is useless and meaningless without release. The concept of reuse is vital to elegant [http://en.wikipedia.org/wiki/Object_oriented_design Object-Oriented design] and therefore cannot be properly maintained without release.&lt;br /&gt;
&lt;br /&gt;
=='''''Advantages'''''==&lt;br /&gt;
&lt;br /&gt;
The obvious advantages of REP are:&lt;br /&gt;
&lt;br /&gt;
1. Maintainability. There is no need to maintain reused code. This is done by the owner of the resused (released) code.&amp;lt;br&amp;gt;&lt;br /&gt;
2. Flexibility. The consumer of the reused code can decide what version and on what timetable the reused code is adopted.&amp;lt;br&amp;gt;&lt;br /&gt;
3. Enhancements. There is no need to make the reused code more efficient or to add function. New function can be added by upgrading to a new version of the reused code.&lt;br /&gt;
&lt;br /&gt;
=='''''Disadvantages'''''==&lt;br /&gt;
&lt;br /&gt;
As REP is a Cohesion Principle, the disadvantages would be similar to disadvantages of cohesion principles.&lt;br /&gt;
&lt;br /&gt;
1. REP is not simple for the maintainer of the code. The code owner must maintain several versions of the code, as well as large packages.&amp;lt;br&amp;gt;&lt;br /&gt;
2. The package structure cannot be designed from the top down, meaning that it would not be one of the first things about a system that is designed. Because of this, the package structure remains in a constant state of flux. [3]&amp;lt;br&amp;gt;&lt;br /&gt;
3. The best design philosophy cannot depend solely on REP. REP is best suited for a system that has gone through the initial planning, design and development stages to ensure that the package structure can be utilized effectively.&lt;br /&gt;
&lt;br /&gt;
=='''''Example'''''==&lt;br /&gt;
&lt;br /&gt;
The Java Boutique desribes a [http://javaboutique.internet.com/Case_Study/ tutorial] for designing a system with, among other primciples, REP in mind.&lt;br /&gt;
&lt;br /&gt;
=='''''Conclusion'''''==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''References'''''&lt;br /&gt;
&lt;br /&gt;
[1] Design Principles and Patterns: http://www.objectmentor.com/resources/articles/Principles_and_Patterns.pdf &amp;lt;br&amp;gt;&lt;br /&gt;
[2] Reuse Release Equivalence Principle: http://c2.com/cgi/wiki$?ReuseReleaseEquivalencePrinciple&amp;lt;br&amp;gt;&lt;br /&gt;
[3] Granularity: http://www.objectmentor.com/resources/articles/granularity.pdf&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Discostu</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki3_teamhelm&amp;diff=27193</id>
		<title>CSC/ECE 517 Fall 2009/wiki3 teamhelm</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki3_teamhelm&amp;diff=27193"/>
		<updated>2009-11-17T02:26:14Z</updated>

		<summary type="html">&lt;p&gt;Discostu: /* '''''Example''''' */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''The Release Reuse Equivalency Principle (REP)''' ==&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=='''''Concept'''''==&lt;br /&gt;
&lt;br /&gt;
The Release Reuse Equivalency Principle (REP), first introduced by [http://en.wikipedia.org/wiki/Robert_Cecil_Martin Bob Martin], is described as follows:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;''The granule of reuse is the granule of release.''&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Martin elaborates: &amp;quot;A reusable element, be it a component, a class, or a cluster of classes, cannot be&lt;br /&gt;
reused unless it is managed by a release system of some kind. Users will be unwilling&lt;br /&gt;
to use the element if they are forced to upgrade every time the author changes it.&lt;br /&gt;
Thus. even though the author has released a new version of his reusable element, he&lt;br /&gt;
must be willing to support and maintain older versions while his customers go about&lt;br /&gt;
the slow business of getting ready to upgrade. Thus, clients will refuse to reuse an element&lt;br /&gt;
unless the author promises to keep track of version numbers, and maintain old&lt;br /&gt;
versions for awhile.&lt;br /&gt;
Therefore, one criterion for grouping classes into packages is reuse. Since packages&lt;br /&gt;
are the unit of release, they are also the unit of reuse. Therefore architects would do&lt;br /&gt;
well to group reusable classes together into packages.&amp;quot; [1]&lt;br /&gt;
&lt;br /&gt;
=='''''Description'''''==&lt;br /&gt;
&lt;br /&gt;
Martin describes a &amp;quot;release system&amp;quot; in his concept, which refers to a system that is able to track versions of code as it is changed. This is also sometimes referred to as [http://en.wikipedia.org/wiki/Version_control version control]. Some common examples of version control are [http://en.wikipedia.org/wiki/Subversion_%28software%29 SVN], [http://en.wikipedia.org/wiki/Concurrent_Versions_System CVS] and [http://en.wikipedia.org/wiki/Cmvc CMVC].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Martin also states that customers are slow to upgrade newer versions of code. This is commonly true for several reasons, including fear of instability of software, internal process, management approvals, and downtime for software systems.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Another critical concept here is that Martin states clients will refuse to upgrade unless the author tracks version numbers. This is related to the previous concept, where a client or customer, because of the above factors, may need to revert the system to a previous version of the code because the new version has caused a problem or outage.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
REP has also been described in the following way:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;..in order to effectively reuse code it must arrive in a complete, black-box, package that is to be used but not changed. Users of the code are shielded from changes to it because they can choose when to integrate changes from the package into their own code. While this supports code ownership, and even promotes it, it does not enforce it.&amp;quot; [2]&lt;br /&gt;
&lt;br /&gt;
Further elaboration on REP is noted here:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;I reuse code if, and only if, I never need to look at&lt;br /&gt;
the [http://en.wikipedia.org/wiki/Source_code source code] (other than the public portions of header files). I need only link with static&lt;br /&gt;
[http://en.wikipedia.org/wiki/Library_%28computing%29 libraries] or include dynamic libraries. Whenever these libraries are fixed or enhanced, I&lt;br /&gt;
receive a new version which I can then integrate into my system when opportunity allows. That is, I expect the code I am reusing to be treated like a product. It is not maintained&lt;br /&gt;
by me. It is not distributed by me. I am the customer, and the author, or some other entity,&lt;br /&gt;
is responsible for maintaining it. Thus, I can reuse nothing that is not also released. Moreover, when I reuse something&lt;br /&gt;
in a released library, I am in effect a client of the entire library.&amp;quot;[3]&lt;br /&gt;
&lt;br /&gt;
In a nutshell, Martin is stating that reuse (not copying) is useless and meaningless without release. The concept of reuse is vital to elegant [http://en.wikipedia.org/wiki/Object_oriented_design Object-Oriented design] and therefore cannot be properly maintained without release.&lt;br /&gt;
&lt;br /&gt;
=='''''Advantages'''''==&lt;br /&gt;
&lt;br /&gt;
The obvious advantages of REP are:&lt;br /&gt;
&lt;br /&gt;
1. Maintainability. There is no need to maintain reused code. This is done by the owner of the resused (released) code.&amp;lt;br&amp;gt;&lt;br /&gt;
2. Flexibility. The consumer of the reused code can decide what version and on what timetable the reused code is adopted.&amp;lt;br&amp;gt;&lt;br /&gt;
3. Enhancements. There is no need to make the reused code more efficient or to add function. New function can be added by upgrading to a new version of the reused code.&lt;br /&gt;
&lt;br /&gt;
=='''''Disadvantages'''''==&lt;br /&gt;
&lt;br /&gt;
As REP is a Cohesion Principle, the disadvantages would be similar to disadvantages of cohesion principles.&lt;br /&gt;
&lt;br /&gt;
1. REP is not simple for the maintainer of the code. The code owner must maintain several versions of the code, as well as large packages.&amp;lt;br&amp;gt;&lt;br /&gt;
2. The package structure cannot be designed from the top down, meaning that it would not be one of the first things about a system that is designed. Because of this, the package structure remains in a constant state of flux. [3]&amp;lt;br&amp;gt;&lt;br /&gt;
3. The best design philosophy cannot depend solely on REP. REP is best suited for a system that has gone through the initial planning, design and development stages to ensure that the package structure can be utilized effectively.&lt;br /&gt;
&lt;br /&gt;
=='''''Example'''''==&lt;br /&gt;
&lt;br /&gt;
The Java Boutique desribes a [http://javaboutique.internet.com/Case_Study/image014.gif tutorial] for designing a system with, among other primciples, REP in mind.&lt;br /&gt;
&lt;br /&gt;
=='''''Conclusion'''''==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''References'''''&lt;br /&gt;
&lt;br /&gt;
[1] Design Principles and Patterns: http://www.objectmentor.com/resources/articles/Principles_and_Patterns.pdf &amp;lt;br&amp;gt;&lt;br /&gt;
[2] Reuse Release Equivalence Principle: http://c2.com/cgi/wiki$?ReuseReleaseEquivalencePrinciple&amp;lt;br&amp;gt;&lt;br /&gt;
[3] Granularity: http://www.objectmentor.com/resources/articles/granularity.pdf&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Discostu</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki3_teamhelm&amp;diff=27192</id>
		<title>CSC/ECE 517 Fall 2009/wiki3 teamhelm</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki3_teamhelm&amp;diff=27192"/>
		<updated>2009-11-17T02:19:49Z</updated>

		<summary type="html">&lt;p&gt;Discostu: /* '''''Disadvantages''''' */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''The Release Reuse Equivalency Principle (REP)''' ==&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=='''''Concept'''''==&lt;br /&gt;
&lt;br /&gt;
The Release Reuse Equivalency Principle (REP), first introduced by [http://en.wikipedia.org/wiki/Robert_Cecil_Martin Bob Martin], is described as follows:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;''The granule of reuse is the granule of release.''&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Martin elaborates: &amp;quot;A reusable element, be it a component, a class, or a cluster of classes, cannot be&lt;br /&gt;
reused unless it is managed by a release system of some kind. Users will be unwilling&lt;br /&gt;
to use the element if they are forced to upgrade every time the author changes it.&lt;br /&gt;
Thus. even though the author has released a new version of his reusable element, he&lt;br /&gt;
must be willing to support and maintain older versions while his customers go about&lt;br /&gt;
the slow business of getting ready to upgrade. Thus, clients will refuse to reuse an element&lt;br /&gt;
unless the author promises to keep track of version numbers, and maintain old&lt;br /&gt;
versions for awhile.&lt;br /&gt;
Therefore, one criterion for grouping classes into packages is reuse. Since packages&lt;br /&gt;
are the unit of release, they are also the unit of reuse. Therefore architects would do&lt;br /&gt;
well to group reusable classes together into packages.&amp;quot; [1]&lt;br /&gt;
&lt;br /&gt;
=='''''Description'''''==&lt;br /&gt;
&lt;br /&gt;
Martin describes a &amp;quot;release system&amp;quot; in his concept, which refers to a system that is able to track versions of code as it is changed. This is also sometimes referred to as [http://en.wikipedia.org/wiki/Version_control version control]. Some common examples of version control are [http://en.wikipedia.org/wiki/Subversion_%28software%29 SVN], [http://en.wikipedia.org/wiki/Concurrent_Versions_System CVS] and [http://en.wikipedia.org/wiki/Cmvc CMVC].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Martin also states that customers are slow to upgrade newer versions of code. This is commonly true for several reasons, including fear of instability of software, internal process, management approvals, and downtime for software systems.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Another critical concept here is that Martin states clients will refuse to upgrade unless the author tracks version numbers. This is related to the previous concept, where a client or customer, because of the above factors, may need to revert the system to a previous version of the code because the new version has caused a problem or outage.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
REP has also been described in the following way:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;..in order to effectively reuse code it must arrive in a complete, black-box, package that is to be used but not changed. Users of the code are shielded from changes to it because they can choose when to integrate changes from the package into their own code. While this supports code ownership, and even promotes it, it does not enforce it.&amp;quot; [2]&lt;br /&gt;
&lt;br /&gt;
Further elaboration on REP is noted here:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;I reuse code if, and only if, I never need to look at&lt;br /&gt;
the [http://en.wikipedia.org/wiki/Source_code source code] (other than the public portions of header files). I need only link with static&lt;br /&gt;
[http://en.wikipedia.org/wiki/Library_%28computing%29 libraries] or include dynamic libraries. Whenever these libraries are fixed or enhanced, I&lt;br /&gt;
receive a new version which I can then integrate into my system when opportunity allows. That is, I expect the code I am reusing to be treated like a product. It is not maintained&lt;br /&gt;
by me. It is not distributed by me. I am the customer, and the author, or some other entity,&lt;br /&gt;
is responsible for maintaining it. Thus, I can reuse nothing that is not also released. Moreover, when I reuse something&lt;br /&gt;
in a released library, I am in effect a client of the entire library.&amp;quot;[3]&lt;br /&gt;
&lt;br /&gt;
In a nutshell, Martin is stating that reuse (not copying) is useless and meaningless without release. The concept of reuse is vital to elegant [http://en.wikipedia.org/wiki/Object_oriented_design Object-Oriented design] and therefore cannot be properly maintained without release.&lt;br /&gt;
&lt;br /&gt;
=='''''Advantages'''''==&lt;br /&gt;
&lt;br /&gt;
The obvious advantages of REP are:&lt;br /&gt;
&lt;br /&gt;
1. Maintainability. There is no need to maintain reused code. This is done by the owner of the resused (released) code.&amp;lt;br&amp;gt;&lt;br /&gt;
2. Flexibility. The consumer of the reused code can decide what version and on what timetable the reused code is adopted.&amp;lt;br&amp;gt;&lt;br /&gt;
3. Enhancements. There is no need to make the reused code more efficient or to add function. New function can be added by upgrading to a new version of the reused code.&lt;br /&gt;
&lt;br /&gt;
=='''''Disadvantages'''''==&lt;br /&gt;
&lt;br /&gt;
As REP is a Cohesion Principle, the disadvantages would be similar to disadvantages of cohesion principles.&lt;br /&gt;
&lt;br /&gt;
1. REP is not simple for the maintainer of the code. The code owner must maintain several versions of the code, as well as large packages.&amp;lt;br&amp;gt;&lt;br /&gt;
2. The package structure cannot be designed from the top down, meaning that it would not be one of the first things about a system that is designed. Because of this, the package structure remains in a constant state of flux. [3]&amp;lt;br&amp;gt;&lt;br /&gt;
3. The best design philosophy cannot depend solely on REP. REP is best suited for a system that has gone through the initial planning, design and development stages to ensure that the package structure can be utilized effectively.&lt;br /&gt;
&lt;br /&gt;
=='''''Example'''''==&lt;br /&gt;
&lt;br /&gt;
=='''''Conclusion'''''==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''References'''''&lt;br /&gt;
&lt;br /&gt;
[1] Design Principles and Patterns: http://www.objectmentor.com/resources/articles/Principles_and_Patterns.pdf &amp;lt;br&amp;gt;&lt;br /&gt;
[2] Reuse Release Equivalence Principle: http://c2.com/cgi/wiki$?ReuseReleaseEquivalencePrinciple&amp;lt;br&amp;gt;&lt;br /&gt;
[3] Granularity: http://www.objectmentor.com/resources/articles/granularity.pdf&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Discostu</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki3_teamhelm&amp;diff=27191</id>
		<title>CSC/ECE 517 Fall 2009/wiki3 teamhelm</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki3_teamhelm&amp;diff=27191"/>
		<updated>2009-11-17T02:14:16Z</updated>

		<summary type="html">&lt;p&gt;Discostu: /* '''''Disadvantages''''' */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''The Release Reuse Equivalency Principle (REP)''' ==&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=='''''Concept'''''==&lt;br /&gt;
&lt;br /&gt;
The Release Reuse Equivalency Principle (REP), first introduced by [http://en.wikipedia.org/wiki/Robert_Cecil_Martin Bob Martin], is described as follows:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;''The granule of reuse is the granule of release.''&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Martin elaborates: &amp;quot;A reusable element, be it a component, a class, or a cluster of classes, cannot be&lt;br /&gt;
reused unless it is managed by a release system of some kind. Users will be unwilling&lt;br /&gt;
to use the element if they are forced to upgrade every time the author changes it.&lt;br /&gt;
Thus. even though the author has released a new version of his reusable element, he&lt;br /&gt;
must be willing to support and maintain older versions while his customers go about&lt;br /&gt;
the slow business of getting ready to upgrade. Thus, clients will refuse to reuse an element&lt;br /&gt;
unless the author promises to keep track of version numbers, and maintain old&lt;br /&gt;
versions for awhile.&lt;br /&gt;
Therefore, one criterion for grouping classes into packages is reuse. Since packages&lt;br /&gt;
are the unit of release, they are also the unit of reuse. Therefore architects would do&lt;br /&gt;
well to group reusable classes together into packages.&amp;quot; [1]&lt;br /&gt;
&lt;br /&gt;
=='''''Description'''''==&lt;br /&gt;
&lt;br /&gt;
Martin describes a &amp;quot;release system&amp;quot; in his concept, which refers to a system that is able to track versions of code as it is changed. This is also sometimes referred to as [http://en.wikipedia.org/wiki/Version_control version control]. Some common examples of version control are [http://en.wikipedia.org/wiki/Subversion_%28software%29 SVN], [http://en.wikipedia.org/wiki/Concurrent_Versions_System CVS] and [http://en.wikipedia.org/wiki/Cmvc CMVC].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Martin also states that customers are slow to upgrade newer versions of code. This is commonly true for several reasons, including fear of instability of software, internal process, management approvals, and downtime for software systems.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Another critical concept here is that Martin states clients will refuse to upgrade unless the author tracks version numbers. This is related to the previous concept, where a client or customer, because of the above factors, may need to revert the system to a previous version of the code because the new version has caused a problem or outage.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
REP has also been described in the following way:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;..in order to effectively reuse code it must arrive in a complete, black-box, package that is to be used but not changed. Users of the code are shielded from changes to it because they can choose when to integrate changes from the package into their own code. While this supports code ownership, and even promotes it, it does not enforce it.&amp;quot; [2]&lt;br /&gt;
&lt;br /&gt;
Further elaboration on REP is noted here:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;I reuse code if, and only if, I never need to look at&lt;br /&gt;
the [http://en.wikipedia.org/wiki/Source_code source code] (other than the public portions of header files). I need only link with static&lt;br /&gt;
[http://en.wikipedia.org/wiki/Library_%28computing%29 libraries] or include dynamic libraries. Whenever these libraries are fixed or enhanced, I&lt;br /&gt;
receive a new version which I can then integrate into my system when opportunity allows. That is, I expect the code I am reusing to be treated like a product. It is not maintained&lt;br /&gt;
by me. It is not distributed by me. I am the customer, and the author, or some other entity,&lt;br /&gt;
is responsible for maintaining it. Thus, I can reuse nothing that is not also released. Moreover, when I reuse something&lt;br /&gt;
in a released library, I am in effect a client of the entire library.&amp;quot;[3]&lt;br /&gt;
&lt;br /&gt;
In a nutshell, Martin is stating that reuse (not copying) is useless and meaningless without release. The concept of reuse is vital to elegant [http://en.wikipedia.org/wiki/Object_oriented_design Object-Oriented design] and therefore cannot be properly maintained without release.&lt;br /&gt;
&lt;br /&gt;
=='''''Advantages'''''==&lt;br /&gt;
&lt;br /&gt;
The obvious advantages of REP are:&lt;br /&gt;
&lt;br /&gt;
1. Maintainability. There is no need to maintain reused code. This is done by the owner of the resused (released) code.&amp;lt;br&amp;gt;&lt;br /&gt;
2. Flexibility. The consumer of the reused code can decide what version and on what timetable the reused code is adopted.&amp;lt;br&amp;gt;&lt;br /&gt;
3. Enhancements. There is no need to make the reused code more efficient or to add function. New function can be added by upgrading to a new version of the reused code.&lt;br /&gt;
&lt;br /&gt;
=='''''Disadvantages'''''==&lt;br /&gt;
&lt;br /&gt;
As REP is a Cohesion Principle, the disadvantages would be similar to disadvantages of cohesion principles.&lt;br /&gt;
&lt;br /&gt;
1. REP is not simple for the maintainer of the code. The code owner must maintain several versions of the code, as well as large packages.&amp;lt;br&amp;gt;&lt;br /&gt;
2. The package structure cannot be designed from the top down, meaning that it would not be one of the first things about a system that is designed. Because of this, the package structure remains in a constant state of flux. [3]&lt;br /&gt;
&lt;br /&gt;
=='''''Example'''''==&lt;br /&gt;
&lt;br /&gt;
=='''''Conclusion'''''==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''References'''''&lt;br /&gt;
&lt;br /&gt;
[1] Design Principles and Patterns: http://www.objectmentor.com/resources/articles/Principles_and_Patterns.pdf &amp;lt;br&amp;gt;&lt;br /&gt;
[2] Reuse Release Equivalence Principle: http://c2.com/cgi/wiki$?ReuseReleaseEquivalencePrinciple&amp;lt;br&amp;gt;&lt;br /&gt;
[3] Granularity: http://www.objectmentor.com/resources/articles/granularity.pdf&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Discostu</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki3_teamhelm&amp;diff=27190</id>
		<title>CSC/ECE 517 Fall 2009/wiki3 teamhelm</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki3_teamhelm&amp;diff=27190"/>
		<updated>2009-11-17T02:13:59Z</updated>

		<summary type="html">&lt;p&gt;Discostu: /* '''''Disadvantages''''' */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''The Release Reuse Equivalency Principle (REP)''' ==&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=='''''Concept'''''==&lt;br /&gt;
&lt;br /&gt;
The Release Reuse Equivalency Principle (REP), first introduced by [http://en.wikipedia.org/wiki/Robert_Cecil_Martin Bob Martin], is described as follows:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;''The granule of reuse is the granule of release.''&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Martin elaborates: &amp;quot;A reusable element, be it a component, a class, or a cluster of classes, cannot be&lt;br /&gt;
reused unless it is managed by a release system of some kind. Users will be unwilling&lt;br /&gt;
to use the element if they are forced to upgrade every time the author changes it.&lt;br /&gt;
Thus. even though the author has released a new version of his reusable element, he&lt;br /&gt;
must be willing to support and maintain older versions while his customers go about&lt;br /&gt;
the slow business of getting ready to upgrade. Thus, clients will refuse to reuse an element&lt;br /&gt;
unless the author promises to keep track of version numbers, and maintain old&lt;br /&gt;
versions for awhile.&lt;br /&gt;
Therefore, one criterion for grouping classes into packages is reuse. Since packages&lt;br /&gt;
are the unit of release, they are also the unit of reuse. Therefore architects would do&lt;br /&gt;
well to group reusable classes together into packages.&amp;quot; [1]&lt;br /&gt;
&lt;br /&gt;
=='''''Description'''''==&lt;br /&gt;
&lt;br /&gt;
Martin describes a &amp;quot;release system&amp;quot; in his concept, which refers to a system that is able to track versions of code as it is changed. This is also sometimes referred to as [http://en.wikipedia.org/wiki/Version_control version control]. Some common examples of version control are [http://en.wikipedia.org/wiki/Subversion_%28software%29 SVN], [http://en.wikipedia.org/wiki/Concurrent_Versions_System CVS] and [http://en.wikipedia.org/wiki/Cmvc CMVC].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Martin also states that customers are slow to upgrade newer versions of code. This is commonly true for several reasons, including fear of instability of software, internal process, management approvals, and downtime for software systems.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Another critical concept here is that Martin states clients will refuse to upgrade unless the author tracks version numbers. This is related to the previous concept, where a client or customer, because of the above factors, may need to revert the system to a previous version of the code because the new version has caused a problem or outage.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
REP has also been described in the following way:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;..in order to effectively reuse code it must arrive in a complete, black-box, package that is to be used but not changed. Users of the code are shielded from changes to it because they can choose when to integrate changes from the package into their own code. While this supports code ownership, and even promotes it, it does not enforce it.&amp;quot; [2]&lt;br /&gt;
&lt;br /&gt;
Further elaboration on REP is noted here:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;I reuse code if, and only if, I never need to look at&lt;br /&gt;
the [http://en.wikipedia.org/wiki/Source_code source code] (other than the public portions of header files). I need only link with static&lt;br /&gt;
[http://en.wikipedia.org/wiki/Library_%28computing%29 libraries] or include dynamic libraries. Whenever these libraries are fixed or enhanced, I&lt;br /&gt;
receive a new version which I can then integrate into my system when opportunity allows. That is, I expect the code I am reusing to be treated like a product. It is not maintained&lt;br /&gt;
by me. It is not distributed by me. I am the customer, and the author, or some other entity,&lt;br /&gt;
is responsible for maintaining it. Thus, I can reuse nothing that is not also released. Moreover, when I reuse something&lt;br /&gt;
in a released library, I am in effect a client of the entire library.&amp;quot;[3]&lt;br /&gt;
&lt;br /&gt;
In a nutshell, Martin is stating that reuse (not copying) is useless and meaningless without release. The concept of reuse is vital to elegant [http://en.wikipedia.org/wiki/Object_oriented_design Object-Oriented design] and therefore cannot be properly maintained without release.&lt;br /&gt;
&lt;br /&gt;
=='''''Advantages'''''==&lt;br /&gt;
&lt;br /&gt;
The obvious advantages of REP are:&lt;br /&gt;
&lt;br /&gt;
1. Maintainability. There is no need to maintain reused code. This is done by the owner of the resused (released) code.&amp;lt;br&amp;gt;&lt;br /&gt;
2. Flexibility. The consumer of the reused code can decide what version and on what timetable the reused code is adopted.&amp;lt;br&amp;gt;&lt;br /&gt;
3. Enhancements. There is no need to make the reused code more efficient or to add function. New function can be added by upgrading to a new version of the reused code.&lt;br /&gt;
&lt;br /&gt;
=='''''Disadvantages'''''==&lt;br /&gt;
&lt;br /&gt;
As REP is a Cohesion Principle, the disadvantages would be similar to disadvantages of cohesion principles.&lt;br /&gt;
&lt;br /&gt;
1. REP is not simple for the maintainer of the code. The code owner must maintain several versions of the code, as well as large packages.&amp;lt;br&amp;gt;&lt;br /&gt;
2. The package structure cannot be designed from the top down, meaning that it would not be one of the first things about a system that is designed. Because of this, the package structure remains in a constant state of flux. [2]&lt;br /&gt;
&lt;br /&gt;
=='''''Example'''''==&lt;br /&gt;
&lt;br /&gt;
=='''''Conclusion'''''==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''References'''''&lt;br /&gt;
&lt;br /&gt;
[1] Design Principles and Patterns: http://www.objectmentor.com/resources/articles/Principles_and_Patterns.pdf &amp;lt;br&amp;gt;&lt;br /&gt;
[2] Reuse Release Equivalence Principle: http://c2.com/cgi/wiki$?ReuseReleaseEquivalencePrinciple&amp;lt;br&amp;gt;&lt;br /&gt;
[3] Granularity: http://www.objectmentor.com/resources/articles/granularity.pdf&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Discostu</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki3_teamhelm&amp;diff=26907</id>
		<title>CSC/ECE 517 Fall 2009/wiki3 teamhelm</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki3_teamhelm&amp;diff=26907"/>
		<updated>2009-11-15T16:07:24Z</updated>

		<summary type="html">&lt;p&gt;Discostu: /* '''''Concept''''' */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''The Release Reuse Equivalency Principle (REP)''' ==&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=='''''Concept'''''==&lt;br /&gt;
&lt;br /&gt;
The Release Reuse Equivalency Principle (REP), first introduced by [http://en.wikipedia.org/wiki/Robert_Cecil_Martin Bob Martin], is described as follows:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;''The granule of reuse is the granule of release.''&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Martin elaborates: &amp;quot;A reusable element, be it a component, a class, or a cluster of classes, cannot be&lt;br /&gt;
reused unless it is managed by a release system of some kind. Users will be unwilling&lt;br /&gt;
to use the element if they are forced to upgrade every time the author changes it.&lt;br /&gt;
Thus. even though the author has released a new version of his reusable element, he&lt;br /&gt;
must be willing to support and maintain older versions while his customers go about&lt;br /&gt;
the slow business of getting ready to upgrade. Thus, clients will refuse to reuse an element&lt;br /&gt;
unless the author promises to keep track of version numbers, and maintain old&lt;br /&gt;
versions for awhile.&lt;br /&gt;
Therefore, one criterion for grouping classes into packages is reuse. Since packages&lt;br /&gt;
are the unit of release, they are also the unit of reuse. Therefore architects would do&lt;br /&gt;
well to group reusable classes together into packages.&amp;quot; [1]&lt;br /&gt;
&lt;br /&gt;
=='''''Description'''''==&lt;br /&gt;
&lt;br /&gt;
Martin describes a &amp;quot;release system&amp;quot; in his concept, which refers to a system that is able to track versions of code as it is changed. This is also sometimes referred to as [http://en.wikipedia.org/wiki/Version_control version control]. Some common examples of version control are [http://en.wikipedia.org/wiki/Subversion_%28software%29 SVN], [http://en.wikipedia.org/wiki/Concurrent_Versions_System CVS] and [http://en.wikipedia.org/wiki/Cmvc CMVC].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Martin also states that customers are slow to upgrade newer versions of code. This is commonly true for several reasons, including fear of instability of software, internal process, management approvals, and downtime for software systems.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Another critical concept here is that Martin states clients will refuse to upgrade unless the author tracks version numbers. This is related to the previous concept, where a client or customer, because of the above factors, may need to revert the system to a previous version of the code because the new version has caused a problem or outage.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
REP has also been described in the following way:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;..in order to effectively reuse code it must arrive in a complete, black-box, package that is to be used but not changed. Users of the code are shielded from changes to it because they can choose when to integrate changes from the package into their own code. While this supports code ownership, and even promotes it, it does not enforce it.&amp;quot; [2]&lt;br /&gt;
&lt;br /&gt;
Further elaboration on REP is noted here:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;I reuse code if, and only if, I never need to look at&lt;br /&gt;
the [http://en.wikipedia.org/wiki/Source_code source code] (other than the public portions of header files). I need only link with static&lt;br /&gt;
[http://en.wikipedia.org/wiki/Library_%28computing%29 libraries] or include dynamic libraries. Whenever these libraries are fixed or enhanced, I&lt;br /&gt;
receive a new version which I can then integrate into my system when opportunity allows. That is, I expect the code I am reusing to be treated like a product. It is not maintained&lt;br /&gt;
by me. It is not distributed by me. I am the customer, and the author, or some other entity,&lt;br /&gt;
is responsible for maintaining it. Thus, I can reuse nothing that is not also released. Moreover, when I reuse something&lt;br /&gt;
in a released library, I am in effect a client of the entire library.&amp;quot;[3]&lt;br /&gt;
&lt;br /&gt;
In a nutshell, Martin is stating that reuse (not copying) is useless and meaningless without release. The concept of reuse is vital to elegant [http://en.wikipedia.org/wiki/Object_oriented_design Object-Oriented design] and therefore cannot be properly maintained without release.&lt;br /&gt;
&lt;br /&gt;
=='''''Advantages'''''==&lt;br /&gt;
&lt;br /&gt;
The obvious advantages of REP are:&lt;br /&gt;
&lt;br /&gt;
1. Maintainability. There is no need to maintain reused code. This is done by the owner of the resused (released) code.&amp;lt;br&amp;gt;&lt;br /&gt;
2. Flexibility. The consumer of the reused code can decide what version and on what timetable the reused code is adopted.&amp;lt;br&amp;gt;&lt;br /&gt;
3. Enhancements. There is no need to make the reused code more efficient or to add function. New function can be added by upgrading to a new version of the reused code.&lt;br /&gt;
&lt;br /&gt;
=='''''Disadvantages'''''==&lt;br /&gt;
&lt;br /&gt;
=='''''Example'''''==&lt;br /&gt;
&lt;br /&gt;
=='''''Conclusion'''''==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''References'''''&lt;br /&gt;
&lt;br /&gt;
[1] Design Principles and Patterns: http://www.objectmentor.com/resources/articles/Principles_and_Patterns.pdf &amp;lt;br&amp;gt;&lt;br /&gt;
[2] Reuse Release Equivalence Principle: http://c2.com/cgi/wiki$?ReuseReleaseEquivalencePrinciple&amp;lt;br&amp;gt;&lt;br /&gt;
[3] Granularity: http://www.objectmentor.com/resources/articles/granularity.pdf&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Discostu</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki3_teamhelm&amp;diff=26826</id>
		<title>CSC/ECE 517 Fall 2009/wiki3 teamhelm</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki3_teamhelm&amp;diff=26826"/>
		<updated>2009-11-14T16:25:24Z</updated>

		<summary type="html">&lt;p&gt;Discostu: /* '''''Advantages''''' */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''The Release Reuse Equivalency Principle (REP)''' ==&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=='''''Concept'''''==&lt;br /&gt;
&lt;br /&gt;
The Release Reuse Equivalency Principle (REP), first introduced by [http://en.wikipedia.org/wiki/Robert_Cecil_Martin Bob Martin], is described as follows:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;''The granule of reuse is the granule of release.''&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;A reusable element, be it a component, a class, or a cluster of classes, cannot be&lt;br /&gt;
reused unless it is managed by a release system of some kind. Users will be unwilling&lt;br /&gt;
to use the element if they are forced to upgrade every time the author changes it.&lt;br /&gt;
Thus. even though the author has released a new version of his reusable element, he&lt;br /&gt;
must be willing to support and maintain older versions while his customers go about&lt;br /&gt;
the slow business of getting ready to upgrade. Thus, clients will refuse to reuse an element&lt;br /&gt;
unless the author promises to keep track of version numbers, and maintain old&lt;br /&gt;
versions for awhile.&lt;br /&gt;
Therefore, one criterion for grouping classes into packages is reuse. Since packages&lt;br /&gt;
are the unit of release, they are also the unit of reuse. Therefore architects would do&lt;br /&gt;
well to group reusable classes together into packages.&amp;quot; [1]&lt;br /&gt;
&lt;br /&gt;
=='''''Description'''''==&lt;br /&gt;
&lt;br /&gt;
Martin describes a &amp;quot;release system&amp;quot; in his concept, which refers to a system that is able to track versions of code as it is changed. This is also sometimes referred to as [http://en.wikipedia.org/wiki/Version_control version control]. Some common examples of version control are [http://en.wikipedia.org/wiki/Subversion_%28software%29 SVN], [http://en.wikipedia.org/wiki/Concurrent_Versions_System CVS] and [http://en.wikipedia.org/wiki/Cmvc CMVC].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Martin also states that customers are slow to upgrade newer versions of code. This is commonly true for several reasons, including fear of instability of software, internal process, management approvals, and downtime for software systems.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Another critical concept here is that Martin states clients will refuse to upgrade unless the author tracks version numbers. This is related to the previous concept, where a client or customer, because of the above factors, may need to revert the system to a previous version of the code because the new version has caused a problem or outage.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
REP has also been described in the following way:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;..in order to effectively reuse code it must arrive in a complete, black-box, package that is to be used but not changed. Users of the code are shielded from changes to it because they can choose when to integrate changes from the package into their own code. While this supports code ownership, and even promotes it, it does not enforce it.&amp;quot; [2]&lt;br /&gt;
&lt;br /&gt;
Further elaboration on REP is noted here:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;I reuse code if, and only if, I never need to look at&lt;br /&gt;
the [http://en.wikipedia.org/wiki/Source_code source code] (other than the public portions of header files). I need only link with static&lt;br /&gt;
[http://en.wikipedia.org/wiki/Library_%28computing%29 libraries] or include dynamic libraries. Whenever these libraries are fixed or enhanced, I&lt;br /&gt;
receive a new version which I can then integrate into my system when opportunity allows. That is, I expect the code I am reusing to be treated like a product. It is not maintained&lt;br /&gt;
by me. It is not distributed by me. I am the customer, and the author, or some other entity,&lt;br /&gt;
is responsible for maintaining it. Thus, I can reuse nothing that is not also released. Moreover, when I reuse something&lt;br /&gt;
in a released library, I am in effect a client of the entire library.&amp;quot;[3]&lt;br /&gt;
&lt;br /&gt;
In a nutshell, Martin is stating that reuse (not copying) is useless and meaningless without release. The concept of reuse is vital to elegant [http://en.wikipedia.org/wiki/Object_oriented_design Object-Oriented design] and therefore cannot be properly maintained without release.&lt;br /&gt;
&lt;br /&gt;
=='''''Advantages'''''==&lt;br /&gt;
&lt;br /&gt;
The obvious advantages of REP are:&lt;br /&gt;
&lt;br /&gt;
1. Maintainability. There is no need to maintain reused code. This is done by the owner of the resused (released) code.&amp;lt;br&amp;gt;&lt;br /&gt;
2. Flexibility. The consumer of the reused code can decide what version and on what timetable the reused code is adopted.&amp;lt;br&amp;gt;&lt;br /&gt;
3. Enhancements. There is no need to make the reused code more efficient or to add function. New function can be added by upgrading to a new version of the reused code.&lt;br /&gt;
&lt;br /&gt;
=='''''Disadvantages'''''==&lt;br /&gt;
&lt;br /&gt;
=='''''Example'''''==&lt;br /&gt;
&lt;br /&gt;
=='''''Conclusion'''''==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''References'''''&lt;br /&gt;
&lt;br /&gt;
[1] Design Principles and Patterns: http://www.objectmentor.com/resources/articles/Principles_and_Patterns.pdf &amp;lt;br&amp;gt;&lt;br /&gt;
[2] Reuse Release Equivalence Principle: http://c2.com/cgi/wiki$?ReuseReleaseEquivalencePrinciple&amp;lt;br&amp;gt;&lt;br /&gt;
[3] Granularity: http://www.objectmentor.com/resources/articles/granularity.pdf&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Discostu</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki3_teamhelm&amp;diff=26825</id>
		<title>CSC/ECE 517 Fall 2009/wiki3 teamhelm</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki3_teamhelm&amp;diff=26825"/>
		<updated>2009-11-14T16:24:57Z</updated>

		<summary type="html">&lt;p&gt;Discostu: /* '''''Description''''' */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''The Release Reuse Equivalency Principle (REP)''' ==&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=='''''Concept'''''==&lt;br /&gt;
&lt;br /&gt;
The Release Reuse Equivalency Principle (REP), first introduced by [http://en.wikipedia.org/wiki/Robert_Cecil_Martin Bob Martin], is described as follows:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;''The granule of reuse is the granule of release.''&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;A reusable element, be it a component, a class, or a cluster of classes, cannot be&lt;br /&gt;
reused unless it is managed by a release system of some kind. Users will be unwilling&lt;br /&gt;
to use the element if they are forced to upgrade every time the author changes it.&lt;br /&gt;
Thus. even though the author has released a new version of his reusable element, he&lt;br /&gt;
must be willing to support and maintain older versions while his customers go about&lt;br /&gt;
the slow business of getting ready to upgrade. Thus, clients will refuse to reuse an element&lt;br /&gt;
unless the author promises to keep track of version numbers, and maintain old&lt;br /&gt;
versions for awhile.&lt;br /&gt;
Therefore, one criterion for grouping classes into packages is reuse. Since packages&lt;br /&gt;
are the unit of release, they are also the unit of reuse. Therefore architects would do&lt;br /&gt;
well to group reusable classes together into packages.&amp;quot; [1]&lt;br /&gt;
&lt;br /&gt;
=='''''Description'''''==&lt;br /&gt;
&lt;br /&gt;
Martin describes a &amp;quot;release system&amp;quot; in his concept, which refers to a system that is able to track versions of code as it is changed. This is also sometimes referred to as [http://en.wikipedia.org/wiki/Version_control version control]. Some common examples of version control are [http://en.wikipedia.org/wiki/Subversion_%28software%29 SVN], [http://en.wikipedia.org/wiki/Concurrent_Versions_System CVS] and [http://en.wikipedia.org/wiki/Cmvc CMVC].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Martin also states that customers are slow to upgrade newer versions of code. This is commonly true for several reasons, including fear of instability of software, internal process, management approvals, and downtime for software systems.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Another critical concept here is that Martin states clients will refuse to upgrade unless the author tracks version numbers. This is related to the previous concept, where a client or customer, because of the above factors, may need to revert the system to a previous version of the code because the new version has caused a problem or outage.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
REP has also been described in the following way:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;..in order to effectively reuse code it must arrive in a complete, black-box, package that is to be used but not changed. Users of the code are shielded from changes to it because they can choose when to integrate changes from the package into their own code. While this supports code ownership, and even promotes it, it does not enforce it.&amp;quot; [2]&lt;br /&gt;
&lt;br /&gt;
Further elaboration on REP is noted here:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;I reuse code if, and only if, I never need to look at&lt;br /&gt;
the [http://en.wikipedia.org/wiki/Source_code source code] (other than the public portions of header files). I need only link with static&lt;br /&gt;
[http://en.wikipedia.org/wiki/Library_%28computing%29 libraries] or include dynamic libraries. Whenever these libraries are fixed or enhanced, I&lt;br /&gt;
receive a new version which I can then integrate into my system when opportunity allows. That is, I expect the code I am reusing to be treated like a product. It is not maintained&lt;br /&gt;
by me. It is not distributed by me. I am the customer, and the author, or some other entity,&lt;br /&gt;
is responsible for maintaining it. Thus, I can reuse nothing that is not also released. Moreover, when I reuse something&lt;br /&gt;
in a released library, I am in effect a client of the entire library.&amp;quot;[3]&lt;br /&gt;
&lt;br /&gt;
In a nutshell, Martin is stating that reuse (not copying) is useless and meaningless without release. The concept of reuse is vital to elegant [http://en.wikipedia.org/wiki/Object_oriented_design Object-Oriented design] and therefore cannot be properly maintained without release.&lt;br /&gt;
&lt;br /&gt;
=='''''Advantages'''''==&lt;br /&gt;
&lt;br /&gt;
The obvious advantages of REP are:&lt;br /&gt;
&lt;br /&gt;
1. Maintainability. There is no need to maintain reused code. This is done by the owner of the resused (released) code.&lt;br /&gt;
2. Flexibility. The consumer of the reused code can decide what version and on what timetable the reused code is adopted.&lt;br /&gt;
3. Enhancements. There is no need to make the reused code more efficient or to add function. New function can be added by upgrading to a new version of the reused code.&lt;br /&gt;
&lt;br /&gt;
=='''''Disadvantages'''''==&lt;br /&gt;
&lt;br /&gt;
=='''''Example'''''==&lt;br /&gt;
&lt;br /&gt;
=='''''Conclusion'''''==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''References'''''&lt;br /&gt;
&lt;br /&gt;
[1] Design Principles and Patterns: http://www.objectmentor.com/resources/articles/Principles_and_Patterns.pdf &amp;lt;br&amp;gt;&lt;br /&gt;
[2] Reuse Release Equivalence Principle: http://c2.com/cgi/wiki$?ReuseReleaseEquivalencePrinciple&amp;lt;br&amp;gt;&lt;br /&gt;
[3] Granularity: http://www.objectmentor.com/resources/articles/granularity.pdf&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Discostu</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki3_teamhelm&amp;diff=26824</id>
		<title>CSC/ECE 517 Fall 2009/wiki3 teamhelm</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki3_teamhelm&amp;diff=26824"/>
		<updated>2009-11-14T16:21:03Z</updated>

		<summary type="html">&lt;p&gt;Discostu: /* '''''Advantages''''' */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''The Release Reuse Equivalency Principle (REP)''' ==&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=='''''Concept'''''==&lt;br /&gt;
&lt;br /&gt;
The Release Reuse Equivalency Principle (REP), first introduced by [http://en.wikipedia.org/wiki/Robert_Cecil_Martin Bob Martin], is described as follows:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;''The granule of reuse is the granule of release.''&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;A reusable element, be it a component, a class, or a cluster of classes, cannot be&lt;br /&gt;
reused unless it is managed by a release system of some kind. Users will be unwilling&lt;br /&gt;
to use the element if they are forced to upgrade every time the author changes it.&lt;br /&gt;
Thus. even though the author has released a new version of his reusable element, he&lt;br /&gt;
must be willing to support and maintain older versions while his customers go about&lt;br /&gt;
the slow business of getting ready to upgrade. Thus, clients will refuse to reuse an element&lt;br /&gt;
unless the author promises to keep track of version numbers, and maintain old&lt;br /&gt;
versions for awhile.&lt;br /&gt;
Therefore, one criterion for grouping classes into packages is reuse. Since packages&lt;br /&gt;
are the unit of release, they are also the unit of reuse. Therefore architects would do&lt;br /&gt;
well to group reusable classes together into packages.&amp;quot; [1]&lt;br /&gt;
&lt;br /&gt;
=='''''Description'''''==&lt;br /&gt;
&lt;br /&gt;
Martin describes a &amp;quot;release system&amp;quot; in his concept, which refers to a system that is able to track versions of code as it is changed. This is also sometimes referred to as [http://en.wikipedia.org/wiki/Version_control version control]. Some common examples of version control are [http://en.wikipedia.org/wiki/Subversion_%28software%29 SVN], [http://en.wikipedia.org/wiki/Concurrent_Versions_System CVS] and [http://en.wikipedia.org/wiki/Cmvc CMVC].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Martin also states that customers are slow to upgrade newer versions of code. This is commonly true for several reasons, including fear of instability of software, internal process, management approvals, and downtime for software systems.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Another critical concept here is that Martin states clients will refuse to upgrade unless the author tracks version numbers. This is related to the previous concept, where a client or customer, because of the above factors, may need to revert the system to a previous version of the code because the new version has caused a problem or outage.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
REP has also been described in the following way:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;..in order to effectively reuse code it must arrive in a complete, black-box, package that is to be used but not changed. Users of the code are shielded from changes to it because they can choose when to integrate changes from the package into their own code. While this supports code ownership, and even promotes it, it does not enforce it.&amp;quot; [2]&lt;br /&gt;
&lt;br /&gt;
Further elaboration on REP is noted here:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;I reuse code if, and only if, I never need to look at&lt;br /&gt;
the source code (other than the public portions of header files). I need only link with static&lt;br /&gt;
libraries or include dynamic libraries. Whenever these libraries are fixed or enhanced, I&lt;br /&gt;
receive a new version which I can then integrate into my system when opportunity allows. That is, I expect the code I am reusing to be treated like a product. It is not maintained&lt;br /&gt;
by me. It is not distributed by me. I am the customer, and the author, or some other entity,&lt;br /&gt;
is responsible for maintaining it. Thus, I can reuse nothing that is not also released. Moreover, when I reuse something&lt;br /&gt;
in a released library, I am in effect a client of the entire library.&amp;quot;[3]&lt;br /&gt;
&lt;br /&gt;
In a nutshell, Martin is stating that reuse (not copying) is useless and meaningless without release. The concept of reuse is vital to elegant OO design and therefore cannot be properly maintained without release.&lt;br /&gt;
&lt;br /&gt;
=='''''Advantages'''''==&lt;br /&gt;
&lt;br /&gt;
The obvious advantages of REP are:&lt;br /&gt;
&lt;br /&gt;
1. Maintainability. There is no need to maintain reused code. This is done by the owner of the resused (released) code.&lt;br /&gt;
2. Flexibility. The consumer of the reused code can decide what version and on what timetable the reused code is adopted.&lt;br /&gt;
3. Enhancements. There is no need to make the reused code more efficient or to add function. New function can be added by upgrading to a new version of the reused code.&lt;br /&gt;
&lt;br /&gt;
=='''''Disadvantages'''''==&lt;br /&gt;
&lt;br /&gt;
=='''''Example'''''==&lt;br /&gt;
&lt;br /&gt;
=='''''Conclusion'''''==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''References'''''&lt;br /&gt;
&lt;br /&gt;
[1] Design Principles and Patterns: http://www.objectmentor.com/resources/articles/Principles_and_Patterns.pdf &amp;lt;br&amp;gt;&lt;br /&gt;
[2] Reuse Release Equivalence Principle: http://c2.com/cgi/wiki$?ReuseReleaseEquivalencePrinciple&amp;lt;br&amp;gt;&lt;br /&gt;
[3] Granularity: http://www.objectmentor.com/resources/articles/granularity.pdf&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Discostu</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki3_teamhelm&amp;diff=26823</id>
		<title>CSC/ECE 517 Fall 2009/wiki3 teamhelm</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki3_teamhelm&amp;diff=26823"/>
		<updated>2009-11-14T16:15:58Z</updated>

		<summary type="html">&lt;p&gt;Discostu: /* '''''Description''''' */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''The Release Reuse Equivalency Principle (REP)''' ==&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=='''''Concept'''''==&lt;br /&gt;
&lt;br /&gt;
The Release Reuse Equivalency Principle (REP), first introduced by [http://en.wikipedia.org/wiki/Robert_Cecil_Martin Bob Martin], is described as follows:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;''The granule of reuse is the granule of release.''&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;A reusable element, be it a component, a class, or a cluster of classes, cannot be&lt;br /&gt;
reused unless it is managed by a release system of some kind. Users will be unwilling&lt;br /&gt;
to use the element if they are forced to upgrade every time the author changes it.&lt;br /&gt;
Thus. even though the author has released a new version of his reusable element, he&lt;br /&gt;
must be willing to support and maintain older versions while his customers go about&lt;br /&gt;
the slow business of getting ready to upgrade. Thus, clients will refuse to reuse an element&lt;br /&gt;
unless the author promises to keep track of version numbers, and maintain old&lt;br /&gt;
versions for awhile.&lt;br /&gt;
Therefore, one criterion for grouping classes into packages is reuse. Since packages&lt;br /&gt;
are the unit of release, they are also the unit of reuse. Therefore architects would do&lt;br /&gt;
well to group reusable classes together into packages.&amp;quot; [1]&lt;br /&gt;
&lt;br /&gt;
=='''''Description'''''==&lt;br /&gt;
&lt;br /&gt;
Martin describes a &amp;quot;release system&amp;quot; in his concept, which refers to a system that is able to track versions of code as it is changed. This is also sometimes referred to as [http://en.wikipedia.org/wiki/Version_control version control]. Some common examples of version control are [http://en.wikipedia.org/wiki/Subversion_%28software%29 SVN], [http://en.wikipedia.org/wiki/Concurrent_Versions_System CVS] and [http://en.wikipedia.org/wiki/Cmvc CMVC].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Martin also states that customers are slow to upgrade newer versions of code. This is commonly true for several reasons, including fear of instability of software, internal process, management approvals, and downtime for software systems.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Another critical concept here is that Martin states clients will refuse to upgrade unless the author tracks version numbers. This is related to the previous concept, where a client or customer, because of the above factors, may need to revert the system to a previous version of the code because the new version has caused a problem or outage.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
REP has also been described in the following way:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;..in order to effectively reuse code it must arrive in a complete, black-box, package that is to be used but not changed. Users of the code are shielded from changes to it because they can choose when to integrate changes from the package into their own code. While this supports code ownership, and even promotes it, it does not enforce it.&amp;quot; [2]&lt;br /&gt;
&lt;br /&gt;
Further elaboration on REP is noted here:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;I reuse code if, and only if, I never need to look at&lt;br /&gt;
the source code (other than the public portions of header files). I need only link with static&lt;br /&gt;
libraries or include dynamic libraries. Whenever these libraries are fixed or enhanced, I&lt;br /&gt;
receive a new version which I can then integrate into my system when opportunity allows. That is, I expect the code I am reusing to be treated like a product. It is not maintained&lt;br /&gt;
by me. It is not distributed by me. I am the customer, and the author, or some other entity,&lt;br /&gt;
is responsible for maintaining it. Thus, I can reuse nothing that is not also released. Moreover, when I reuse something&lt;br /&gt;
in a released library, I am in effect a client of the entire library.&amp;quot;[3]&lt;br /&gt;
&lt;br /&gt;
In a nutshell, Martin is stating that reuse (not copying) is useless and meaningless without release. The concept of reuse is vital to elegant OO design and therefore cannot be properly maintained without release.&lt;br /&gt;
&lt;br /&gt;
=='''''Advantages'''''==&lt;br /&gt;
&lt;br /&gt;
=='''''Disadvantages'''''==&lt;br /&gt;
&lt;br /&gt;
=='''''Example'''''==&lt;br /&gt;
&lt;br /&gt;
=='''''Conclusion'''''==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''References'''''&lt;br /&gt;
&lt;br /&gt;
[1] Design Principles and Patterns: http://www.objectmentor.com/resources/articles/Principles_and_Patterns.pdf &amp;lt;br&amp;gt;&lt;br /&gt;
[2] Reuse Release Equivalence Principle: http://c2.com/cgi/wiki$?ReuseReleaseEquivalencePrinciple&amp;lt;br&amp;gt;&lt;br /&gt;
[3] Granularity: http://www.objectmentor.com/resources/articles/granularity.pdf&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Discostu</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki3_teamhelm&amp;diff=26822</id>
		<title>CSC/ECE 517 Fall 2009/wiki3 teamhelm</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki3_teamhelm&amp;diff=26822"/>
		<updated>2009-11-14T16:13:28Z</updated>

		<summary type="html">&lt;p&gt;Discostu: /* '''''Conclusion''''' */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''The Release Reuse Equivalency Principle (REP)''' ==&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=='''''Concept'''''==&lt;br /&gt;
&lt;br /&gt;
The Release Reuse Equivalency Principle (REP), first introduced by [http://en.wikipedia.org/wiki/Robert_Cecil_Martin Bob Martin], is described as follows:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;''The granule of reuse is the granule of release.''&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;A reusable element, be it a component, a class, or a cluster of classes, cannot be&lt;br /&gt;
reused unless it is managed by a release system of some kind. Users will be unwilling&lt;br /&gt;
to use the element if they are forced to upgrade every time the author changes it.&lt;br /&gt;
Thus. even though the author has released a new version of his reusable element, he&lt;br /&gt;
must be willing to support and maintain older versions while his customers go about&lt;br /&gt;
the slow business of getting ready to upgrade. Thus, clients will refuse to reuse an element&lt;br /&gt;
unless the author promises to keep track of version numbers, and maintain old&lt;br /&gt;
versions for awhile.&lt;br /&gt;
Therefore, one criterion for grouping classes into packages is reuse. Since packages&lt;br /&gt;
are the unit of release, they are also the unit of reuse. Therefore architects would do&lt;br /&gt;
well to group reusable classes together into packages.&amp;quot; [1]&lt;br /&gt;
&lt;br /&gt;
=='''''Description'''''==&lt;br /&gt;
&lt;br /&gt;
Martin describes a &amp;quot;release system&amp;quot; in his concept, which refers to a system that is able to track versions of code as it is changed. This is also sometimes referred to as [http://en.wikipedia.org/wiki/Version_control version control]. Some common examples of version control are [http://en.wikipedia.org/wiki/Subversion_%28software%29 SVN], [http://en.wikipedia.org/wiki/Concurrent_Versions_System CVS] and [http://en.wikipedia.org/wiki/Cmvc CMVC].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Martin also states that customers are slow to upgrade newer versions of code. This is commonly true for several reasons, including fear of instability of software, internal process, management approvals, and downtime for software systems.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Another critical concept here is that Martin states clients will refuse to upgrade unless the author tracks version numbers. This is related to the previous concept, where a client or customer, because of the above factors, may need to revert the system to a previous version of the code because the new version has caused a problem or outage.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
REP has also been described in the following way:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;..in order to effectively reuse code it must arrive in a complete, black-box, package that is to be used but not changed. Users of the code are shielded from changes to it because they can choose when to integrate changes from the package into their own code. While this supports code ownership, and even promotes it, it does not enforce it.&amp;quot; [2]&lt;br /&gt;
&lt;br /&gt;
Further elaboration on REP is noted here:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;I reuse code if, and only if, I never need to look at&lt;br /&gt;
the source code (other than the public portions of header files). I need only link with static&lt;br /&gt;
libraries or include dynamic libraries. Whenever these libraries are fixed or enhanced, I&lt;br /&gt;
receive a new version which I can then integrate into my system when opportunity allows. That is, I expect the code I am reusing to be treated like a product. It is not maintained&lt;br /&gt;
by me. It is not distributed by me. I am the customer, and the author, or some other entity,&lt;br /&gt;
is responsible for maintaining it. Thus, I can reuse nothing that is not also released. Moreover, when I reuse something&lt;br /&gt;
in a released library, I am in effect a client of the entire library.&amp;quot;[3]&lt;br /&gt;
&lt;br /&gt;
=='''''Advantages'''''==&lt;br /&gt;
&lt;br /&gt;
=='''''Disadvantages'''''==&lt;br /&gt;
&lt;br /&gt;
=='''''Example'''''==&lt;br /&gt;
&lt;br /&gt;
=='''''Conclusion'''''==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''References'''''&lt;br /&gt;
&lt;br /&gt;
[1] Design Principles and Patterns: http://www.objectmentor.com/resources/articles/Principles_and_Patterns.pdf &amp;lt;br&amp;gt;&lt;br /&gt;
[2] Reuse Release Equivalence Principle: http://c2.com/cgi/wiki$?ReuseReleaseEquivalencePrinciple&amp;lt;br&amp;gt;&lt;br /&gt;
[3] Granularity: http://www.objectmentor.com/resources/articles/granularity.pdf&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Discostu</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki3_teamhelm&amp;diff=26821</id>
		<title>CSC/ECE 517 Fall 2009/wiki3 teamhelm</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki3_teamhelm&amp;diff=26821"/>
		<updated>2009-11-14T16:12:54Z</updated>

		<summary type="html">&lt;p&gt;Discostu: /* '''''Description''''' */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''The Release Reuse Equivalency Principle (REP)''' ==&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=='''''Concept'''''==&lt;br /&gt;
&lt;br /&gt;
The Release Reuse Equivalency Principle (REP), first introduced by [http://en.wikipedia.org/wiki/Robert_Cecil_Martin Bob Martin], is described as follows:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;''The granule of reuse is the granule of release.''&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;A reusable element, be it a component, a class, or a cluster of classes, cannot be&lt;br /&gt;
reused unless it is managed by a release system of some kind. Users will be unwilling&lt;br /&gt;
to use the element if they are forced to upgrade every time the author changes it.&lt;br /&gt;
Thus. even though the author has released a new version of his reusable element, he&lt;br /&gt;
must be willing to support and maintain older versions while his customers go about&lt;br /&gt;
the slow business of getting ready to upgrade. Thus, clients will refuse to reuse an element&lt;br /&gt;
unless the author promises to keep track of version numbers, and maintain old&lt;br /&gt;
versions for awhile.&lt;br /&gt;
Therefore, one criterion for grouping classes into packages is reuse. Since packages&lt;br /&gt;
are the unit of release, they are also the unit of reuse. Therefore architects would do&lt;br /&gt;
well to group reusable classes together into packages.&amp;quot; [1]&lt;br /&gt;
&lt;br /&gt;
=='''''Description'''''==&lt;br /&gt;
&lt;br /&gt;
Martin describes a &amp;quot;release system&amp;quot; in his concept, which refers to a system that is able to track versions of code as it is changed. This is also sometimes referred to as [http://en.wikipedia.org/wiki/Version_control version control]. Some common examples of version control are [http://en.wikipedia.org/wiki/Subversion_%28software%29 SVN], [http://en.wikipedia.org/wiki/Concurrent_Versions_System CVS] and [http://en.wikipedia.org/wiki/Cmvc CMVC].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Martin also states that customers are slow to upgrade newer versions of code. This is commonly true for several reasons, including fear of instability of software, internal process, management approvals, and downtime for software systems.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Another critical concept here is that Martin states clients will refuse to upgrade unless the author tracks version numbers. This is related to the previous concept, where a client or customer, because of the above factors, may need to revert the system to a previous version of the code because the new version has caused a problem or outage.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
REP has also been described in the following way:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;..in order to effectively reuse code it must arrive in a complete, black-box, package that is to be used but not changed. Users of the code are shielded from changes to it because they can choose when to integrate changes from the package into their own code. While this supports code ownership, and even promotes it, it does not enforce it.&amp;quot; [2]&lt;br /&gt;
&lt;br /&gt;
Further elaboration on REP is noted here:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;I reuse code if, and only if, I never need to look at&lt;br /&gt;
the source code (other than the public portions of header files). I need only link with static&lt;br /&gt;
libraries or include dynamic libraries. Whenever these libraries are fixed or enhanced, I&lt;br /&gt;
receive a new version which I can then integrate into my system when opportunity allows. That is, I expect the code I am reusing to be treated like a product. It is not maintained&lt;br /&gt;
by me. It is not distributed by me. I am the customer, and the author, or some other entity,&lt;br /&gt;
is responsible for maintaining it. Thus, I can reuse nothing that is not also released. Moreover, when I reuse something&lt;br /&gt;
in a released library, I am in effect a client of the entire library.&amp;quot;[3]&lt;br /&gt;
&lt;br /&gt;
=='''''Advantages'''''==&lt;br /&gt;
&lt;br /&gt;
=='''''Disadvantages'''''==&lt;br /&gt;
&lt;br /&gt;
=='''''Example'''''==&lt;br /&gt;
&lt;br /&gt;
=='''''Conclusion'''''==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''References'''''&lt;br /&gt;
&lt;br /&gt;
[1] Design Principles and Patterns: http://www.objectmentor.com/resources/articles/Principles_and_Patterns.pdf &amp;lt;br&amp;gt;&lt;br /&gt;
[2] Reuse Release Equivalence Principle: http://c2.com/cgi/wiki$?ReuseReleaseEquivalencePrinciple&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Discostu</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki3_teamhelm&amp;diff=26820</id>
		<title>CSC/ECE 517 Fall 2009/wiki3 teamhelm</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki3_teamhelm&amp;diff=26820"/>
		<updated>2009-11-14T16:06:09Z</updated>

		<summary type="html">&lt;p&gt;Discostu: /* '''''Conclusion''''' */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''The Release Reuse Equivalency Principle (REP)''' ==&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=='''''Concept'''''==&lt;br /&gt;
&lt;br /&gt;
The Release Reuse Equivalency Principle (REP), first introduced by [http://en.wikipedia.org/wiki/Robert_Cecil_Martin Bob Martin], is described as follows:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;''The granule of reuse is the granule of release.''&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;A reusable element, be it a component, a class, or a cluster of classes, cannot be&lt;br /&gt;
reused unless it is managed by a release system of some kind. Users will be unwilling&lt;br /&gt;
to use the element if they are forced to upgrade every time the author changes it.&lt;br /&gt;
Thus. even though the author has released a new version of his reusable element, he&lt;br /&gt;
must be willing to support and maintain older versions while his customers go about&lt;br /&gt;
the slow business of getting ready to upgrade. Thus, clients will refuse to reuse an element&lt;br /&gt;
unless the author promises to keep track of version numbers, and maintain old&lt;br /&gt;
versions for awhile.&lt;br /&gt;
Therefore, one criterion for grouping classes into packages is reuse. Since packages&lt;br /&gt;
are the unit of release, they are also the unit of reuse. Therefore architects would do&lt;br /&gt;
well to group reusable classes together into packages.&amp;quot; [1]&lt;br /&gt;
&lt;br /&gt;
=='''''Description'''''==&lt;br /&gt;
&lt;br /&gt;
Martin describes a &amp;quot;release system&amp;quot; in his concept, which refers to a system that is able to track versions of code as it is changed. This is also sometimes referred to as [http://en.wikipedia.org/wiki/Version_control version control]. Some common examples of version control are [http://en.wikipedia.org/wiki/Subversion_%28software%29 SVN], [http://en.wikipedia.org/wiki/Concurrent_Versions_System CVS] and [http://en.wikipedia.org/wiki/Cmvc CMVC].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Martin also states that customers are slow to upgrade newer versions of code. This is commonly true for several reasons, including fear of instability of software, internal process, management approvals, and downtime for software systems.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Another critical concept here is that Martin states clients will refuse to upgrade unless the author tracks version numbers. This is related to the previous concept, where a client or customer, because of the above factors, may need to revert the system to a previous version of the code because the new version has caused a problem or outage.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This concept has also been described in the following way:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;..in order to effectively reuse code it must arrive in a complete, black-box, package that is to be used but not changed. Users of the code are shielded from changes to it because they can choose when to integrate changes from the package into their own code. While this supports code ownership, and even promotes it, it does not enforce it.&amp;quot; [2]&lt;br /&gt;
&lt;br /&gt;
=='''''Advantages'''''==&lt;br /&gt;
&lt;br /&gt;
=='''''Disadvantages'''''==&lt;br /&gt;
&lt;br /&gt;
=='''''Example'''''==&lt;br /&gt;
&lt;br /&gt;
=='''''Conclusion'''''==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''References'''''&lt;br /&gt;
&lt;br /&gt;
[1] Design Principles and Patterns: http://www.objectmentor.com/resources/articles/Principles_and_Patterns.pdf &amp;lt;br&amp;gt;&lt;br /&gt;
[2] Reuse Release Equivalence Principle: http://c2.com/cgi/wiki$?ReuseReleaseEquivalencePrinciple&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Discostu</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki3_teamhelm&amp;diff=26819</id>
		<title>CSC/ECE 517 Fall 2009/wiki3 teamhelm</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki3_teamhelm&amp;diff=26819"/>
		<updated>2009-11-14T16:05:05Z</updated>

		<summary type="html">&lt;p&gt;Discostu: /* '''''Description''''' */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''The Release Reuse Equivalency Principle (REP)''' ==&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=='''''Concept'''''==&lt;br /&gt;
&lt;br /&gt;
The Release Reuse Equivalency Principle (REP), first introduced by [http://en.wikipedia.org/wiki/Robert_Cecil_Martin Bob Martin], is described as follows:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;''The granule of reuse is the granule of release.''&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;A reusable element, be it a component, a class, or a cluster of classes, cannot be&lt;br /&gt;
reused unless it is managed by a release system of some kind. Users will be unwilling&lt;br /&gt;
to use the element if they are forced to upgrade every time the author changes it.&lt;br /&gt;
Thus. even though the author has released a new version of his reusable element, he&lt;br /&gt;
must be willing to support and maintain older versions while his customers go about&lt;br /&gt;
the slow business of getting ready to upgrade. Thus, clients will refuse to reuse an element&lt;br /&gt;
unless the author promises to keep track of version numbers, and maintain old&lt;br /&gt;
versions for awhile.&lt;br /&gt;
Therefore, one criterion for grouping classes into packages is reuse. Since packages&lt;br /&gt;
are the unit of release, they are also the unit of reuse. Therefore architects would do&lt;br /&gt;
well to group reusable classes together into packages.&amp;quot; [1]&lt;br /&gt;
&lt;br /&gt;
=='''''Description'''''==&lt;br /&gt;
&lt;br /&gt;
Martin describes a &amp;quot;release system&amp;quot; in his concept, which refers to a system that is able to track versions of code as it is changed. This is also sometimes referred to as [http://en.wikipedia.org/wiki/Version_control version control]. Some common examples of version control are [http://en.wikipedia.org/wiki/Subversion_%28software%29 SVN], [http://en.wikipedia.org/wiki/Concurrent_Versions_System CVS] and [http://en.wikipedia.org/wiki/Cmvc CMVC].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Martin also states that customers are slow to upgrade newer versions of code. This is commonly true for several reasons, including fear of instability of software, internal process, management approvals, and downtime for software systems.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Another critical concept here is that Martin states clients will refuse to upgrade unless the author tracks version numbers. This is related to the previous concept, where a client or customer, because of the above factors, may need to revert the system to a previous version of the code because the new version has caused a problem or outage.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This concept has also been described in the following way:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;..in order to effectively reuse code it must arrive in a complete, black-box, package that is to be used but not changed. Users of the code are shielded from changes to it because they can choose when to integrate changes from the package into their own code. While this supports code ownership, and even promotes it, it does not enforce it.&amp;quot; [2]&lt;br /&gt;
&lt;br /&gt;
=='''''Advantages'''''==&lt;br /&gt;
&lt;br /&gt;
=='''''Disadvantages'''''==&lt;br /&gt;
&lt;br /&gt;
=='''''Example'''''==&lt;br /&gt;
&lt;br /&gt;
=='''''Conclusion'''''==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''References'''''&lt;br /&gt;
&lt;br /&gt;
[1] Design Principles and Patterns: http://www.objectmentor.com/resources/articles/Principles_and_Patterns.pdf &amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Discostu</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki3_teamhelm&amp;diff=26818</id>
		<title>CSC/ECE 517 Fall 2009/wiki3 teamhelm</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki3_teamhelm&amp;diff=26818"/>
		<updated>2009-11-14T15:58:57Z</updated>

		<summary type="html">&lt;p&gt;Discostu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''The Release Reuse Equivalency Principle (REP)''' ==&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=='''''Concept'''''==&lt;br /&gt;
&lt;br /&gt;
The Release Reuse Equivalency Principle (REP), first introduced by [http://en.wikipedia.org/wiki/Robert_Cecil_Martin Bob Martin], is described as follows:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;''The granule of reuse is the granule of release.''&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;A reusable element, be it a component, a class, or a cluster of classes, cannot be&lt;br /&gt;
reused unless it is managed by a release system of some kind. Users will be unwilling&lt;br /&gt;
to use the element if they are forced to upgrade every time the author changes it.&lt;br /&gt;
Thus. even though the author has released a new version of his reusable element, he&lt;br /&gt;
must be willing to support and maintain older versions while his customers go about&lt;br /&gt;
the slow business of getting ready to upgrade. Thus, clients will refuse to reuse an element&lt;br /&gt;
unless the author promises to keep track of version numbers, and maintain old&lt;br /&gt;
versions for awhile.&lt;br /&gt;
Therefore, one criterion for grouping classes into packages is reuse. Since packages&lt;br /&gt;
are the unit of release, they are also the unit of reuse. Therefore architects would do&lt;br /&gt;
well to group reusable classes together into packages.&amp;quot; [1]&lt;br /&gt;
&lt;br /&gt;
=='''''Description'''''==&lt;br /&gt;
&lt;br /&gt;
Martin describes a &amp;quot;release system&amp;quot; in his concept, which refers to a system that is able to track versions of code as it is changed. This is also sometimes referred to as [http://en.wikipedia.org/wiki/Version_control version control]. Some common examples of version control are [http://en.wikipedia.org/wiki/Subversion_%28software%29 SVN], [http://en.wikipedia.org/wiki/Concurrent_Versions_System CVS] and [http://en.wikipedia.org/wiki/Cmvc CMVC].&lt;br /&gt;
&lt;br /&gt;
Martin also states that customers are slow to upgrade newer versions of code. This is commonly true for several reasons, including fear of instability of software, internal process, management approvals, and downtime for software systems.&lt;br /&gt;
&lt;br /&gt;
Another critical concept here is that Martin states clients will refuse to upgrade unless the author tracks version numbers. This is related to the previous concept, where a client or customer, because of the above factors, may need to revert the system to a previous version of the code because the new version has caused a problem or outage.&lt;br /&gt;
&lt;br /&gt;
=='''''Advantages'''''==&lt;br /&gt;
&lt;br /&gt;
=='''''Disadvantages'''''==&lt;br /&gt;
&lt;br /&gt;
=='''''Example'''''==&lt;br /&gt;
&lt;br /&gt;
=='''''Conclusion'''''==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''References'''''&lt;br /&gt;
&lt;br /&gt;
[1] Design Principles and Patterns: http://www.objectmentor.com/resources/articles/Principles_and_Patterns.pdf &amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Discostu</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki3_teamhelm&amp;diff=26817</id>
		<title>CSC/ECE 517 Fall 2009/wiki3 teamhelm</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki3_teamhelm&amp;diff=26817"/>
		<updated>2009-11-14T15:57:44Z</updated>

		<summary type="html">&lt;p&gt;Discostu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''The Release Reuse Equivalency Principle (REP)''' ==&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=='''''Concept'''''==&lt;br /&gt;
&lt;br /&gt;
The Release Reuse Equivalency Principle (REP), first introduced by [http://en.wikipedia.org/wiki/Robert_Cecil_Martin Bob Martin], is described as follows:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;''The granule of reuse is the granule of release.''&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;A reusable element, be it a component, a class, or a cluster of classes, cannot be&lt;br /&gt;
reused unless it is managed by a release system of some kind. Users will be unwilling&lt;br /&gt;
to use the element if they are forced to upgrade every time the author changes it.&lt;br /&gt;
Thus. even though the author has released a new version of his reusable element, he&lt;br /&gt;
must be willing to support and maintain older versions while his customers go about&lt;br /&gt;
the slow business of getting ready to upgrade. Thus, clients will refuse to reuse an element&lt;br /&gt;
unless the author promises to keep track of version numbers, and maintain old&lt;br /&gt;
versions for awhile.&lt;br /&gt;
Therefore, one criterion for grouping classes into packages is reuse. Since packages&lt;br /&gt;
are the unit of release, they are also the unit of reuse. Therefore architects would do&lt;br /&gt;
well to group reusable classes together into packages.&amp;quot; [1]&lt;br /&gt;
&lt;br /&gt;
=='''''Description'''''==&lt;br /&gt;
&lt;br /&gt;
Martin describes a &amp;quot;release system&amp;quot; in his concept, which refers to a system that is able to track versions of code as it is changed. This is also sometimes referred to as &amp;quot;version control&amp;quot;. Some common examples of version control are [http://en.wikipedia.org/wiki/Subversion_%28software%29 SVN], [http://en.wikipedia.org/wiki/Concurrent_Versions_System CVS] and [http://en.wikipedia.org/wiki/Cmvc CMVC].&lt;br /&gt;
&lt;br /&gt;
Martin also states that customers are slow to upgrade newer versions of code. This is commonly true for several reasons, including fear of instability of software, internal process, management approvals, and downtime for software systems.&lt;br /&gt;
&lt;br /&gt;
Another critical concept here is that Martin states clients will refuse to upgrade unless the author tracks version numbers. This is related to the previous concept, where a client or customer, because of the above factors, may need to revert the system to a previous version of the code because the new version has caused a problem or outage.&lt;br /&gt;
&lt;br /&gt;
=='''''Advantages'''''==&lt;br /&gt;
&lt;br /&gt;
=='''''Disadvantages'''''==&lt;br /&gt;
&lt;br /&gt;
=='''''Example'''''==&lt;br /&gt;
&lt;br /&gt;
=='''''Conclusion'''''==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''References'''''&lt;br /&gt;
&lt;br /&gt;
[1] Design Principles and Patterns: http://www.objectmentor.com/resources/articles/Principles_and_Patterns.pdf &amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Discostu</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki3_teamhelm&amp;diff=26816</id>
		<title>CSC/ECE 517 Fall 2009/wiki3 teamhelm</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki3_teamhelm&amp;diff=26816"/>
		<updated>2009-11-14T15:56:25Z</updated>

		<summary type="html">&lt;p&gt;Discostu: /* '''''Description''''' */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''The Release Reuse Equivalency Principle (REP)''' ==&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=='''''Concept'''''==&lt;br /&gt;
&lt;br /&gt;
The Release Reuse Equivalency Principle (REP), first introduced by Bob Martin, is described as follows:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;''The granule of reuse is the granule of release.''&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;A reusable element, be it a component, a class, or a cluster of classes, cannot be&lt;br /&gt;
reused unless it is managed by a release system of some kind. Users will be unwilling&lt;br /&gt;
to use the element if they are forced to upgrade every time the author changes it.&lt;br /&gt;
Thus. even though the author has released a new version of his reusable element, he&lt;br /&gt;
must be willing to support and maintain older versions while his customers go about&lt;br /&gt;
the slow business of getting ready to upgrade. Thus, clients will refuse to reuse an element&lt;br /&gt;
unless the author promises to keep track of version numbers, and maintain old&lt;br /&gt;
versions for awhile.&lt;br /&gt;
Therefore, one criterion for grouping classes into packages is reuse. Since packages&lt;br /&gt;
are the unit of release, they are also the unit of reuse. Therefore architects would do&lt;br /&gt;
well to group reusable classes together into packages.&amp;quot; [1]&lt;br /&gt;
&lt;br /&gt;
=='''''Description'''''==&lt;br /&gt;
&lt;br /&gt;
Martin describes a &amp;quot;release system&amp;quot; in his concept, which refers to a system that is able to track versions of code as it is changed. This is also sometimes referred to as &amp;quot;version control&amp;quot;. Some common examples of version control are [http://en.wikipedia.org/wiki/Subversion_%28software%29 SVN], [http://en.wikipedia.org/wiki/Concurrent_Versions_System CVS] and [http://en.wikipedia.org/wiki/Cmvc CMVC].&lt;br /&gt;
&lt;br /&gt;
Martin also states that customers are slow to upgrade newer versions of code. This is commonly true for several reasons, including fear of instability of software, internal process, management approvals, and downtime for software systems.&lt;br /&gt;
&lt;br /&gt;
Another critical concept here is that Martin states clients will refuse to upgrade unless the author tracks version numbers. This is related to the previous concept, where a client or customer, because of the above factors, may need to revert the system to a previous version of the code because the new version has caused a problem or outage.&lt;br /&gt;
&lt;br /&gt;
=='''''Advantages'''''==&lt;br /&gt;
&lt;br /&gt;
=='''''Disadvantages'''''==&lt;br /&gt;
&lt;br /&gt;
=='''''Example'''''==&lt;br /&gt;
&lt;br /&gt;
=='''''Conclusion'''''==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''References'''''&lt;br /&gt;
&lt;br /&gt;
[1] Design Principles and Patterns: http://www.objectmentor.com/resources/articles/Principles_and_Patterns.pdf &amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Discostu</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki3_teamhelm&amp;diff=26815</id>
		<title>CSC/ECE 517 Fall 2009/wiki3 teamhelm</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki3_teamhelm&amp;diff=26815"/>
		<updated>2009-11-14T15:48:25Z</updated>

		<summary type="html">&lt;p&gt;Discostu: /* '''''Description''''' */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''The Release Reuse Equivalency Principle (REP)''' ==&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=='''''Concept'''''==&lt;br /&gt;
&lt;br /&gt;
The Release Reuse Equivalency Principle (REP), first introduced by Bob Martin, is described as follows:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;''The granule of reuse is the granule of release.''&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;A reusable element, be it a component, a class, or a cluster of classes, cannot be&lt;br /&gt;
reused unless it is managed by a release system of some kind. Users will be unwilling&lt;br /&gt;
to use the element if they are forced to upgrade every time the author changes it.&lt;br /&gt;
Thus. even though the author has released a new version of his reusable element, he&lt;br /&gt;
must be willing to support and maintain older versions while his customers go about&lt;br /&gt;
the slow business of getting ready to upgrade. Thus, clients will refuse to reuse an element&lt;br /&gt;
unless the author promises to keep track of version numbers, and maintain old&lt;br /&gt;
versions for awhile.&lt;br /&gt;
Therefore, one criterion for grouping classes into packages is reuse. Since packages&lt;br /&gt;
are the unit of release, they are also the unit of reuse. Therefore architects would do&lt;br /&gt;
well to group reusable classes together into packages.&amp;quot; [1]&lt;br /&gt;
&lt;br /&gt;
=='''''Description'''''==&lt;br /&gt;
&lt;br /&gt;
Martin describes a &amp;quot;release system&amp;quot; in his concept, which refers to a system that is able to track versions of code as it is changed. This is also sometimes referred to as &amp;quot;version control&amp;quot;. Some common examples of version control are SVN, CVS and CMVC.&lt;br /&gt;
&lt;br /&gt;
Martin also states that customers are slow to upgrade newer versions of code. This is commonly true for several reasons, including fear of instability of software, internal process, management approvals, and downtime for software systems.&lt;br /&gt;
&lt;br /&gt;
Another critical concept here is that Martin states clients will refuse to upgrade unless the author tracks version numbers. This is related to the previous concept, where a client or customer, because of the above factors, may need to revert the system to a previous version of the code because the new version has caused a problem or outage.&lt;br /&gt;
&lt;br /&gt;
=='''''Advantages'''''==&lt;br /&gt;
&lt;br /&gt;
=='''''Disadvantages'''''==&lt;br /&gt;
&lt;br /&gt;
=='''''Example'''''==&lt;br /&gt;
&lt;br /&gt;
=='''''Conclusion'''''==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''References'''''&lt;br /&gt;
&lt;br /&gt;
[1] Design Principles and Patterns: http://www.objectmentor.com/resources/articles/Principles_and_Patterns.pdf &amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Discostu</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki3_teamhelm&amp;diff=26814</id>
		<title>CSC/ECE 517 Fall 2009/wiki3 teamhelm</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki3_teamhelm&amp;diff=26814"/>
		<updated>2009-11-14T15:45:32Z</updated>

		<summary type="html">&lt;p&gt;Discostu: /* '''''Description''''' */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''The Release Reuse Equivalency Principle (REP)''' ==&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=='''''Concept'''''==&lt;br /&gt;
&lt;br /&gt;
The Release Reuse Equivalency Principle (REP), first introduced by Bob Martin, is described as follows:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;''The granule of reuse is the granule of release.''&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;A reusable element, be it a component, a class, or a cluster of classes, cannot be&lt;br /&gt;
reused unless it is managed by a release system of some kind. Users will be unwilling&lt;br /&gt;
to use the element if they are forced to upgrade every time the author changes it.&lt;br /&gt;
Thus. even though the author has released a new version of his reusable element, he&lt;br /&gt;
must be willing to support and maintain older versions while his customers go about&lt;br /&gt;
the slow business of getting ready to upgrade. Thus, clients will refuse to reuse an element&lt;br /&gt;
unless the author promises to keep track of version numbers, and maintain old&lt;br /&gt;
versions for awhile.&lt;br /&gt;
Therefore, one criterion for grouping classes into packages is reuse. Since packages&lt;br /&gt;
are the unit of release, they are also the unit of reuse. Therefore architects would do&lt;br /&gt;
well to group reusable classes together into packages.&amp;quot; [1]&lt;br /&gt;
&lt;br /&gt;
=='''''Description'''''==&lt;br /&gt;
&lt;br /&gt;
Martin describes a &amp;quot;release system&amp;quot; in his concept, which refers to a system that is able to track versions of code as it is changed. This is also sometimes referred to as &amp;quot;version control&amp;quot;. Some common examples of version control are SVN, CVS and CMVC.&lt;br /&gt;
&lt;br /&gt;
Martin also states that customers are slow to upgrade newer versions of code. This is commonly true for several reasons, including fear of instability of software, internal process, management approvals, and downtime for software systems.&lt;br /&gt;
&lt;br /&gt;
=='''''Advantages'''''==&lt;br /&gt;
&lt;br /&gt;
=='''''Disadvantages'''''==&lt;br /&gt;
&lt;br /&gt;
=='''''Example'''''==&lt;br /&gt;
&lt;br /&gt;
=='''''Conclusion'''''==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''References'''''&lt;br /&gt;
&lt;br /&gt;
[1] Design Principles and Patterns: http://www.objectmentor.com/resources/articles/Principles_and_Patterns.pdf &amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Discostu</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki3_teamhelm&amp;diff=26813</id>
		<title>CSC/ECE 517 Fall 2009/wiki3 teamhelm</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki3_teamhelm&amp;diff=26813"/>
		<updated>2009-11-14T15:43:07Z</updated>

		<summary type="html">&lt;p&gt;Discostu: /* '''''Description''''' */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''The Release Reuse Equivalency Principle (REP)''' ==&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=='''''Concept'''''==&lt;br /&gt;
&lt;br /&gt;
The Release Reuse Equivalency Principle (REP), first introduced by Bob Martin, is described as follows:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;''The granule of reuse is the granule of release.''&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;A reusable element, be it a component, a class, or a cluster of classes, cannot be&lt;br /&gt;
reused unless it is managed by a release system of some kind. Users will be unwilling&lt;br /&gt;
to use the element if they are forced to upgrade every time the author changes it.&lt;br /&gt;
Thus. even though the author has released a new version of his reusable element, he&lt;br /&gt;
must be willing to support and maintain older versions while his customers go about&lt;br /&gt;
the slow business of getting ready to upgrade. Thus, clients will refuse to reuse an element&lt;br /&gt;
unless the author promises to keep track of version numbers, and maintain old&lt;br /&gt;
versions for awhile.&lt;br /&gt;
Therefore, one criterion for grouping classes into packages is reuse. Since packages&lt;br /&gt;
are the unit of release, they are also the unit of reuse. Therefore architects would do&lt;br /&gt;
well to group reusable classes together into packages.&amp;quot; [1]&lt;br /&gt;
&lt;br /&gt;
=='''''Description'''''==&lt;br /&gt;
&lt;br /&gt;
Martin describes a &amp;quot;release system&amp;quot; in his concept, which refers to a system that is able to track versions of code as it is changed. This is also sometimes referred to as &amp;quot;version control&amp;quot;. Some common examples of version control are SVN, CVS and CMVC.&lt;br /&gt;
&lt;br /&gt;
=='''''Advantages'''''==&lt;br /&gt;
&lt;br /&gt;
=='''''Disadvantages'''''==&lt;br /&gt;
&lt;br /&gt;
=='''''Example'''''==&lt;br /&gt;
&lt;br /&gt;
=='''''Conclusion'''''==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''References'''''&lt;br /&gt;
&lt;br /&gt;
[1] Design Principles and Patterns: http://www.objectmentor.com/resources/articles/Principles_and_Patterns.pdf &amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Discostu</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki3_teamhelm&amp;diff=26812</id>
		<title>CSC/ECE 517 Fall 2009/wiki3 teamhelm</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki3_teamhelm&amp;diff=26812"/>
		<updated>2009-11-14T15:37:09Z</updated>

		<summary type="html">&lt;p&gt;Discostu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''The Release Reuse Equivalency Principle (REP)''' ==&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=='''''Concept'''''==&lt;br /&gt;
&lt;br /&gt;
The Release Reuse Equivalency Principle (REP), first introduced by Bob Martin, is described as follows:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;''The granule of reuse is the granule of release.''&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;A reusable element, be it a component, a class, or a cluster of classes, cannot be&lt;br /&gt;
reused unless it is managed by a release system of some kind. Users will be unwilling&lt;br /&gt;
to use the element if they are forced to upgrade every time the author changes it.&lt;br /&gt;
Thus. even though the author has released a new version of his reusable element, he&lt;br /&gt;
must be willing to support and maintain older versions while his customers go about&lt;br /&gt;
the slow business of getting ready to upgrade. Thus, clients will refuse to reuse an element&lt;br /&gt;
unless the author promises to keep track of version numbers, and maintain old&lt;br /&gt;
versions for awhile.&lt;br /&gt;
Therefore, one criterion for grouping classes into packages is reuse. Since packages&lt;br /&gt;
are the unit of release, they are also the unit of reuse. Therefore architects would do&lt;br /&gt;
well to group reusable classes together into packages.&amp;quot; [1]&lt;br /&gt;
&lt;br /&gt;
=='''''Description'''''==&lt;br /&gt;
&lt;br /&gt;
=='''''Advantages'''''==&lt;br /&gt;
&lt;br /&gt;
=='''''Disadvantages'''''==&lt;br /&gt;
&lt;br /&gt;
=='''''Example'''''==&lt;br /&gt;
&lt;br /&gt;
=='''''Conclusion'''''==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''References'''''&lt;br /&gt;
&lt;br /&gt;
[1] Design Principles and Patterns: http://www.objectmentor.com/resources/articles/Principles_and_Patterns.pdf &amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Discostu</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki3_teamhelm&amp;diff=26811</id>
		<title>CSC/ECE 517 Fall 2009/wiki3 teamhelm</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki3_teamhelm&amp;diff=26811"/>
		<updated>2009-11-14T15:33:53Z</updated>

		<summary type="html">&lt;p&gt;Discostu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''The Release Reuse Equivalency Principle (REP)''' ==&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=='''''Concept'''''==&lt;br /&gt;
&lt;br /&gt;
The Release Reuse Equivalency Principle (REP), first introduced by Bob Martin, is described as follows:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;''The granule of reuse is the granule of release.''&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;A reusable element, be it a component, a class, or a cluster of classes, cannot be&lt;br /&gt;
reused unless it is managed by a release system of some kind. Users will be unwilling&lt;br /&gt;
to use the element if they are forced to upgrade every time the author changes it.&lt;br /&gt;
Thus. even though the author has released a new version of his reusable element, he&lt;br /&gt;
must be willing to support and maintain older versions while his customers go about&lt;br /&gt;
the slow business of getting ready to upgrade. Thus, clients will refuse to reuse an element&lt;br /&gt;
unless the author promises to keep track of version numbers, and maintain old&lt;br /&gt;
versions for awhile.&lt;br /&gt;
Therefore, one criterion for grouping classes into packages is reuse. Since packages&lt;br /&gt;
are the unit of release, they are also the unit of reuse. Therefore architects would do&lt;br /&gt;
well to group reusable classes together into packages.&amp;quot; [1]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''References'''''&lt;br /&gt;
&lt;br /&gt;
[1] Design Principles and Patterns: http://www.objectmentor.com/resources/articles/Principles_and_Patterns.pdf &amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Discostu</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki3_teamhelm&amp;diff=26810</id>
		<title>CSC/ECE 517 Fall 2009/wiki3 teamhelm</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki3_teamhelm&amp;diff=26810"/>
		<updated>2009-11-14T15:33:40Z</updated>

		<summary type="html">&lt;p&gt;Discostu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''The Release Reuse Equivalency Principle (REP)''' ==&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=='''''Concept'''''==&lt;br /&gt;
&lt;br /&gt;
The Release Reuse Equivalency Principle (REP), first introduced by Bob Martin, is described as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;''The granule of reuse is the granule of release.''&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;A reusable element, be it a component, a class, or a cluster of classes, cannot be&lt;br /&gt;
reused unless it is managed by a release system of some kind. Users will be unwilling&lt;br /&gt;
to use the element if they are forced to upgrade every time the author changes it.&lt;br /&gt;
Thus. even though the author has released a new version of his reusable element, he&lt;br /&gt;
must be willing to support and maintain older versions while his customers go about&lt;br /&gt;
the slow business of getting ready to upgrade. Thus, clients will refuse to reuse an element&lt;br /&gt;
unless the author promises to keep track of version numbers, and maintain old&lt;br /&gt;
versions for awhile.&lt;br /&gt;
Therefore, one criterion for grouping classes into packages is reuse. Since packages&lt;br /&gt;
are the unit of release, they are also the unit of reuse. Therefore architects would do&lt;br /&gt;
well to group reusable classes together into packages.&amp;quot; [1]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''References'''''&lt;br /&gt;
&lt;br /&gt;
[1] Design Principles and Patterns: http://www.objectmentor.com/resources/articles/Principles_and_Patterns.pdf &amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Discostu</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki3_teamhelm&amp;diff=26809</id>
		<title>CSC/ECE 517 Fall 2009/wiki3 teamhelm</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki3_teamhelm&amp;diff=26809"/>
		<updated>2009-11-14T15:30:03Z</updated>

		<summary type="html">&lt;p&gt;Discostu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''The Release Reuse Equivalency Principle (REP)''' ==&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=='''''Concept'''''==&lt;br /&gt;
&lt;br /&gt;
The Release Reuse Equivalency Principle (REP), first introduced by Bob Martin, is described as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;A reusable element, be it a component, a class, or a cluster of classes, cannot be&lt;br /&gt;
reused unless it is managed by a release system of some kind. Users will be unwilling&lt;br /&gt;
to use the element if they are forced to upgrade every time the author changes it.&lt;br /&gt;
Thus. even though the author has released a new version of his reusable element, he&lt;br /&gt;
must be willing to support and maintain older versions while his customers go about&lt;br /&gt;
the slow business of getting ready to upgrade. Thus, clients will refuse to reuse an element&lt;br /&gt;
unless the author promises to keep track of version numbers, and maintain old&lt;br /&gt;
versions for awhile.&lt;br /&gt;
Therefore, one criterion for grouping classes into packages is reuse. Since packages&lt;br /&gt;
are the unit of release, they are also the unit of reuse. Therefore architects would do&lt;br /&gt;
well to group reusable classes together into packages.&amp;quot; [1]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''References'''''&lt;br /&gt;
&lt;br /&gt;
[1] Design Principles and Patterns: http://www.objectmentor.com/resources/articles/Principles_and_Patterns.pdf &amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Discostu</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki3_teamhelm&amp;diff=26808</id>
		<title>CSC/ECE 517 Fall 2009/wiki3 teamhelm</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki3_teamhelm&amp;diff=26808"/>
		<updated>2009-11-14T15:29:37Z</updated>

		<summary type="html">&lt;p&gt;Discostu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''The Release Reuse Equivalency Principle (REP)''' ==&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=='''''Concept'''''==&lt;br /&gt;
&lt;br /&gt;
The Release Reuse Equivalency Principle (REP), first introduced by Bob Martin, is described as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;A reusable element, be it a component, a class, or a cluster of classes, cannot be&lt;br /&gt;
reused unless it is managed by a release system of some kind. Users will be unwilling&lt;br /&gt;
to use the element if they are forced to upgrade every time the author changes it.&lt;br /&gt;
Thus. even though the author has released a new version of his reusable element, he&lt;br /&gt;
must be willing to support and maintain older versions while his customers go about&lt;br /&gt;
the slow business of getting ready to upgrade. Thus, clients will refuse to reuse an element&lt;br /&gt;
unless the author promises to keep track of version numbers, and maintain old&lt;br /&gt;
versions for awhile.&lt;br /&gt;
Therefore, one criterion for grouping classes into packages is reuse. Since packages&lt;br /&gt;
are the unit of release, they are also the unit of reuse. Therefore architects would do&lt;br /&gt;
well to group reusable classes together into packages.&amp;quot; [1]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''References'''''&lt;br /&gt;
&lt;br /&gt;
[1] Design Principles and Patterns: (http://www.objectmentor.com/resources/articles/Principles_and_Patterns.pdf) &amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Discostu</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki3_teamhelm&amp;diff=26807</id>
		<title>CSC/ECE 517 Fall 2009/wiki3 teamhelm</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki3_teamhelm&amp;diff=26807"/>
		<updated>2009-11-14T15:26:46Z</updated>

		<summary type="html">&lt;p&gt;Discostu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''The Release Reuse Equivalency Principle (REP)''' ==&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=='''''Concept'''''==&lt;br /&gt;
&lt;br /&gt;
The Release Reuse Equivalency Principle (REP), first introduced by Bob Martin, is described as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;A reusable element, be it a component, a class, or a cluster of classes, cannot be&lt;br /&gt;
reused unless it is managed by a release system of some kind. Users will be unwilling&lt;br /&gt;
to use the element if they are forced to upgrade every time the author changes it.&lt;br /&gt;
Thus. even though the author has released a new version of his reusable element, he&lt;br /&gt;
must be willing to support and maintain older versions while his customers go about&lt;br /&gt;
the slow business of getting ready to upgrade. Thus, clients will refuse to reuse an element&lt;br /&gt;
unless the author promises to keep track of version numbers, and maintain old&lt;br /&gt;
versions for awhile.&lt;br /&gt;
Therefore, one criterion for grouping classes into packages is reuse. Since packages&lt;br /&gt;
are the unit of release, they are also the unit of reuse. Therefore architects would do&lt;br /&gt;
well to group reusable classes together into packages.&amp;quot; (http://www.objectmentor.com/resources/articles/Principles_and_Patterns.pdf)&lt;/div&gt;</summary>
		<author><name>Discostu</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki3_teamhelm&amp;diff=26806</id>
		<title>CSC/ECE 517 Fall 2009/wiki3 teamhelm</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki3_teamhelm&amp;diff=26806"/>
		<updated>2009-11-14T15:26:12Z</updated>

		<summary type="html">&lt;p&gt;Discostu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''The Release Reuse Equivalency Principle (REP)''' ==&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The Release Reuse Equivalency Principle (REP), first introduced by Bob Martin, is described as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;A reusable element, be it a component, a class, or a cluster of classes, cannot be&lt;br /&gt;
reused unless it is managed by a release system of some kind. Users will be unwilling&lt;br /&gt;
to use the element if they are forced to upgrade every time the author changes it.&lt;br /&gt;
Thus. even though the author has released a new version of his reusable element, he&lt;br /&gt;
must be willing to support and maintain older versions while his customers go about&lt;br /&gt;
the slow business of getting ready to upgrade. Thus, clients will refuse to reuse an element&lt;br /&gt;
unless the author promises to keep track of version numbers, and maintain old&lt;br /&gt;
versions for awhile.&lt;br /&gt;
Therefore, one criterion for grouping classes into packages is reuse. Since packages&lt;br /&gt;
are the unit of release, they are also the unit of reuse. Therefore architects would do&lt;br /&gt;
well to group reusable classes together into packages.&amp;quot; (http://www.objectmentor.com/resources/articles/Principles_and_Patterns.pdf)&lt;/div&gt;</summary>
		<author><name>Discostu</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki3_teamhelm&amp;diff=26805</id>
		<title>CSC/ECE 517 Fall 2009/wiki3 teamhelm</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki3_teamhelm&amp;diff=26805"/>
		<updated>2009-11-14T15:23:54Z</updated>

		<summary type="html">&lt;p&gt;Discostu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Release Reuse Equivalency Principle (REP)&lt;br /&gt;
&lt;br /&gt;
The Release Reuse Equivalency Principle (REP), first introduced by Bob Martin, is described as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;A reusable element, be it a component, a class, or a cluster of classes, cannot be&lt;br /&gt;
reused unless it is managed by a release system of some kind. Users will be unwilling&lt;br /&gt;
to use the element if they are forced to upgrade every time the author changes it.&lt;br /&gt;
Thus. even though the author has released a new version of his reusable element, he&lt;br /&gt;
must be willing to support and maintain older versions while his customers go about&lt;br /&gt;
the slow business of getting ready to upgrade. Thus, clients will refuse to reuse an element&lt;br /&gt;
unless the author promises to keep track of version numbers, and maintain old&lt;br /&gt;
versions for awhile.&lt;br /&gt;
Therefore, one criterion for grouping classes into packages is reuse. Since packages&lt;br /&gt;
are the unit of release, they are also the unit of reuse. Therefore architects would do&lt;br /&gt;
well to group reusable classes together into packages.&amp;quot; (http://www.objectmentor.com/resources/articles/Principles_and_Patterns.pdf)&lt;/div&gt;</summary>
		<author><name>Discostu</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki2pthelm&amp;diff=25792</id>
		<title>CSC/ECE 517 Fall 2009/wiki2pthelm</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki2pthelm&amp;diff=25792"/>
		<updated>2009-10-13T19:14:04Z</updated>

		<summary type="html">&lt;p&gt;Discostu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''Reflection-Oriented Programming''' ==&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Reflection-Oriented Programming''' &amp;lt;b&amp;gt;(ROP)&amp;lt;/b&amp;gt;, or &amp;quot;reflective programming&amp;quot;, is defined as a programming model design with the intent to analyze and improve it's structure, performance or other implementation aspects during runtime (implying no prior knowledge of the [http://en.wikipedia.org/wiki/Source_code source code]), as opposed to compile time. ROP is a natural extension to [http://en.wikipedia.org/wiki/Object-oriented_programming object-oriented programming].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''''Concepts'''''==&lt;br /&gt;
&lt;br /&gt;
Two key concepts of ROP are [http://en.wikipedia.org/wiki/Metadata meta-information], which is the state of the program at execution time, and [http://en.wikipedia.org/wiki/Metaprogramming metaprogramming], which is the idea that a language can act as it's own [http://en.wikipedia.org/wiki/Reflection_%28computer_science%29 reflection]. In other words, a language can reflect (modify) itself. More precisely, we define reflection-oriented programming to be a programming style that uses any means available (reflection or otherwise) to extend the meta-information in order to avoid situations in which a local program's requirements leads to non-local rewriting of said program [4]. Additionally, the ROP concepts extends reflection, in that it can make decisions on the [http://en.wikipedia.org/wiki/Software_architecture architecture] of the system, rather than just [http://en.wikipedia.org/wiki/Method_%28computer_science%29 methods] and [http://en.wikipedia.org/wiki/Variable_%28programming%29 variables].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''''Reflection vs. ROP'''''==&lt;br /&gt;
&lt;br /&gt;
Reflection is the process by which a computer program can observe and modify it's own structure and behavior[1]. It allows an executing program to examine or &amp;quot;introspect&amp;quot; upon itself, and manipulate internal properties of the program[2]. [http://en.wikipedia.org/wiki/Java_%28software_platform%29 Java], [http://en.wikipedia.org/wiki/Ruby_%28programming_language%29 Ruby] and [http://en.wikipedia.org/wiki/.NET_Framework .NET] are among the most popular reflective languages, however there are many others[3]. Although reflection is the primary concept behind ROP, it does not necessarily preclude the existence of ROP. ROP is a concept of design; as with most designs, it is not necessarily dependent on the implementation. As an example, computational programming can also be used to implement the concepts of ROP, and does not assume the presence of source code at runtime, something that is essential to the concept of reflection[4].&lt;br /&gt;
&lt;br /&gt;
The ROP metaprogramming model sequences are defined as either atomic (simple) or compound (multi-atomic). These sequences take advantage of meta-information that retains knowledge of program structure, which is different than a classic object-oriented program that can lose said structure after [http://en.wikipedia.org/wiki/Compiler compilation].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''''Meta-Information'''''==&lt;br /&gt;
&lt;br /&gt;
Meta-Information, or metadata, is the state of the program at execution time. Phrased another way, Meta-information is information about information. For example, a if a document is considered to be information, its title, location, and subject are examples of meta-information[5]. Meta-Information is essential not only for reflection but for the concepts of ROP to be implemented correctly. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''''Metaprogramming'''''==&lt;br /&gt;
&lt;br /&gt;
Metaprogramming introduces the concept of &amp;quot;programs that write programs&amp;quot;. Reflection is one type of metaprogramming, and therefore can be considered as an option when attempting to design a system or program based on the concepts defined by ROP. Metaprograms are written in [http://en.wikipedia.org/wiki/Metalanguage Metalanguage][6], which to be considered for ROP would be defined as the same or alternate language as the system or program to be implemented. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''''Examples'''''==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;''Simple Reflection''&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As an example, first let us review what reflection looks like as an implementation. To see how reflection works, consider this simple example, taken from [http://java.sun.com/developer/technicalArticles/ALT/Reflection/ Using Java Reflection]:&lt;br /&gt;
&lt;br /&gt;
   import java.lang.reflect.*;&lt;br /&gt;
 &lt;br /&gt;
   public class DumpMethods {&lt;br /&gt;
      public static void main(String args[])&lt;br /&gt;
      {&lt;br /&gt;
         try {&lt;br /&gt;
            Class c = Class.forName(args[0]);&lt;br /&gt;
            Method m[] = c.getDeclaredMethods();&lt;br /&gt;
            for (int i = 0; i &amp;lt; m.length; i++)&lt;br /&gt;
            System.out.println(m[i].toString());&lt;br /&gt;
         }&lt;br /&gt;
         catch (Throwable e) {&lt;br /&gt;
            System.err.println(e);&lt;br /&gt;
         }&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For an invocation of:&lt;br /&gt;
&lt;br /&gt;
  java DumpMethods java.util.Stack&lt;br /&gt;
&lt;br /&gt;
the output is:&lt;br /&gt;
&lt;br /&gt;
  public java.lang.Object java.util.Stack.push(&lt;br /&gt;
    java.lang.Object)&lt;br /&gt;
   public synchronized &lt;br /&gt;
     java.lang.Object java.util.Stack.pop()&lt;br /&gt;
   public synchronized&lt;br /&gt;
      java.lang.Object java.util.Stack.peek()&lt;br /&gt;
   public boolean java.util.Stack.empty()&lt;br /&gt;
   public synchronized &lt;br /&gt;
     int java.util.Stack.search(java.lang.Object)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
That is, the method names of class java.util.Stack are listed, along with their fully qualified parameter and return types.&lt;br /&gt;
&lt;br /&gt;
This program loads the specified class using class.forName, and then calls getDeclaredMethods to retrieve the list of methods defined in the class. java.lang.reflect.Method is a class representing a single class method. Reflection is useful because it supports dynamic retrieval of information about classes and data structures by name, and allows for their manipulation within an executing program[2].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;''ROP''&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ROP is more than just simple reflection (although technically, it can be reflection alone), it is also analyzation or improvement at runtime without prior knowledge of source code. A good example of this concept is Measuring Computational Expense from the document [http://www2.parc.com/csl/groups/sda/projects/reflection96/docs/sobel/sobel.pdf An Introduction to Reflection-Oriented Programming]. To implement such behavior, we need only these definitions:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  define reflective &amp;lt;runtime&amp;gt; (&amp;lt;simple-reflective&amp;gt;)&lt;br /&gt;
  slot ticks, init-value: 0;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  define method atomic (v, outer :: &amp;lt;runtime&amp;gt;)&lt;br /&gt;
  update(outer, ticks: add1(outer.ticks))&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  define method compound-initial (outer :: &amp;lt;runtime&amp;gt;)&lt;br /&gt;
  update(outer, ticks: add1(outer.ticks))&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
It is convenient to have default behaviors for [http://en.wikipedia.org/wiki/Atomic_operation atomic], compound-initial (specifies what transition should take place upon entering the initial part of a compound computation), and compound-rest (specifies what meta-information gets passed on to the rest of a compound computation) that simply &amp;quot;thread&amp;quot; meta-information through the computations. The inherited definition of compound-rest suffices. Now suppose we want to evaluate some [http://en.wikipedia.org/wiki/Expression_%28programming%29 expression] E without counting its cost. We could use the reify and reflect operations like this:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  let r = reify(&amp;lt;runtime&amp;gt;);&lt;br /&gt;
  let result = E;&lt;br /&gt;
  reflect(&amp;lt;runtime&amp;gt;, r, result);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Here we capture the expense meta-information before evaluating E and save it as r. After evaluating E, we restore the old meta-information. The result from evaluating E is returned. Of course, any time we want to know the cumulative expense for the program, we can examine reify(&amp;lt;runtime&amp;gt;).ticks[4]. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Java and Ruby are two examples of popular programming languages that are inherently reflective, and therefore could be used to implement an ROP paradigm.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''References'''''&lt;br /&gt;
&lt;br /&gt;
[1] Reflection (Computer Science), Wikipedia: http://en.wikipedia.org/wiki/Reflection_%28computer_science%29 &amp;lt;br&amp;gt;&lt;br /&gt;
[2] Using Java Reflection, Sun: http://java.sun.com/developer/technicalArticles/ALT/Reflection/&amp;lt;br&amp;gt;&lt;br /&gt;
[3] List of reflective programming languages and platforms, Wikipedia: http://en.wikipedia.org/wiki/List_of_reflective_programming_languages_and_platforms&amp;lt;br&amp;gt;&lt;br /&gt;
[4] An Introduction to Reflection-Oriented Programming, Sobel &amp;amp; Friedman: http://www2.parc.com/csl/groups/sda/projects/reflection96/docs/sobel/sobel.pdf&amp;lt;br&amp;gt;&lt;br /&gt;
[5] What is Metainformation?: http://searchoracle.techtarget.com/sDefinition/0,,sid41_gci900705,00.html&amp;lt;br&amp;gt;&lt;br /&gt;
[6] Metaprogramming, Wikipedia: http://en.wikipedia.org/wiki/Metaprogramming&lt;/div&gt;</summary>
		<author><name>Discostu</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki2pthelm&amp;diff=25791</id>
		<title>CSC/ECE 517 Fall 2009/wiki2pthelm</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki2pthelm&amp;diff=25791"/>
		<updated>2009-10-13T19:02:59Z</updated>

		<summary type="html">&lt;p&gt;Discostu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''Reflection-Oriented Programming''' ==&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Reflection-Oriented Programming''' &amp;lt;b&amp;gt;(ROP)&amp;lt;/b&amp;gt;, or &amp;quot;reflective programming&amp;quot;, is defined as a programming model design with the intent to analyze and improve it's structure, performance or other implementation aspects during runtime (implying no prior knowledge of the [http://en.wikipedia.org/wiki/Source_code source code]), as opposed to compile time. ROP is a natural extension to [http://en.wikipedia.org/wiki/Object-oriented_programming object-oriented programming].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''''Concepts'''''==&lt;br /&gt;
&lt;br /&gt;
Two key concepts of ROP are [http://en.wikipedia.org/wiki/Metadata meta-information], which is the state of the program at execution time, and [http://en.wikipedia.org/wiki/Metaprogramming metaprogramming], which is the idea that a language can act as it's own [http://en.wikipedia.org/wiki/Reflection_%28computer_science%29 reflection]. In other words, a language can reflect (modify) itself. More precisely, we define reflection-oriented programming to be a programming style that uses any means available (reflection or otherwise) to extend the meta-information in order to avoid situations in which a local program's requirements leads to non-local rewriting of said program [4]. Additionally, the ROP concepts extends reflection, in that it can make decisions on the [http://en.wikipedia.org/wiki/Software_architecture architecture] of the system, rather than just [http://en.wikipedia.org/wiki/Method_%28computer_science%29 methods] and [http://en.wikipedia.org/wiki/Variable_%28programming%29 variables].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''''Reflection vs. ROP'''''==&lt;br /&gt;
&lt;br /&gt;
Reflection is the process by which a computer program can observe and modify it's own structure and behavior[1]. It allows an executing program to examine or &amp;quot;introspect&amp;quot; upon itself, and manipulate internal properties of the program[2]. [http://en.wikipedia.org/wiki/Java_%28software_platform%29 Java], [http://en.wikipedia.org/wiki/Ruby_%28programming_language%29 Ruby] and [http://en.wikipedia.org/wiki/.NET_Framework .NET] are among the most popular reflective languages, however there are many others[3]. Although reflection is the primary concept behind ROP, it does not necessarily preclude the existence of ROP. ROP is a concept of design; as with most designs, it is not necessarily dependent on the implementation. As an example, computational programming can also be used to implement the concepts of ROP, and does not assume the presence of source code at runtime, something that is essential to the concept of reflection[4].&lt;br /&gt;
&lt;br /&gt;
The ROP metaprogramming model sequences are defined as either atomic (simple) or compound (multi-atomic). These sequences take advantage of meta-information that retains knowledge of program structure, which is different than a classic object-oriented program that can lose said structure after [http://en.wikipedia.org/wiki/Compiler compilation].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''''Meta-Information'''''==&lt;br /&gt;
&lt;br /&gt;
Meta-Information, or metadata, is the state of the program at execution time. Phrased another way, Meta-information is information about information. For example, a if a document is considered to be information, its title, location, and subject are examples of meta-information[5]. Meta-Information is essential not only for reflection but for the concepts of ROP to be implemented correctly. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''''Metaprogramming'''''==&lt;br /&gt;
&lt;br /&gt;
Metaprogramming introduces the concept of &amp;quot;programs that write programs&amp;quot;. Reflection is one type of metaprogramming, and therefore can be considered as an option when attempting to design a system or program based on the concepts defined by ROP. Metaprograms are written in [http://en.wikipedia.org/wiki/Metalanguage Metalanguage][6], which to be considered for ROP would be defined as the same or alternate language as the system or program to be implemented. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''''Examples'''''==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;''Simple Reflection''&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As an example, first let us review what reflection looks like as an implementation. To see how reflection works, consider this simple example, taken from [http://java.sun.com/developer/technicalArticles/ALT/Reflection/ Using Java Reflection]:&lt;br /&gt;
&lt;br /&gt;
   import java.lang.reflect.*;&lt;br /&gt;
 &lt;br /&gt;
   public class DumpMethods {&lt;br /&gt;
      public static void main(String args[])&lt;br /&gt;
      {&lt;br /&gt;
         try {&lt;br /&gt;
            Class c = Class.forName(args[0]);&lt;br /&gt;
            Method m[] = c.getDeclaredMethods();&lt;br /&gt;
            for (int i = 0; i &amp;lt; m.length; i++)&lt;br /&gt;
            System.out.println(m[i].toString());&lt;br /&gt;
         }&lt;br /&gt;
         catch (Throwable e) {&lt;br /&gt;
            System.err.println(e);&lt;br /&gt;
         }&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For an invocation of:&lt;br /&gt;
&lt;br /&gt;
  java DumpMethods java.util.Stack&lt;br /&gt;
&lt;br /&gt;
the output is:&lt;br /&gt;
&lt;br /&gt;
  public java.lang.Object java.util.Stack.push(&lt;br /&gt;
    java.lang.Object)&lt;br /&gt;
   public synchronized &lt;br /&gt;
     java.lang.Object java.util.Stack.pop()&lt;br /&gt;
   public synchronized&lt;br /&gt;
      java.lang.Object java.util.Stack.peek()&lt;br /&gt;
   public boolean java.util.Stack.empty()&lt;br /&gt;
   public synchronized &lt;br /&gt;
     int java.util.Stack.search(java.lang.Object)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
That is, the method names of class java.util.Stack are listed, along with their fully qualified parameter and return types.&lt;br /&gt;
&lt;br /&gt;
This program loads the specified class using class.forName, and then calls getDeclaredMethods to retrieve the list of methods defined in the class. java.lang.reflect.Method is a class representing a single class method. Reflection is useful because it supports dynamic retrieval of information about classes and data structures by name, and allows for their manipulation within an executing program[2].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;''ROP''&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ROP is more than just simple reflection (although technically, it can be reflection alone), it is also analyzation or improvement at runtime without prior knowledge of source code. A good example of this concept is Measuring Computational Expense from the document [http://www2.parc.com/csl/groups/sda/projects/reflection96/docs/sobel/sobel.pdf An Introduction to Reflection-Oriented Programming]. To implement such behavior, we need only these definitions:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  define reflective &amp;lt;runtime&amp;gt; (&amp;lt;simple-reflective&amp;gt;)&lt;br /&gt;
  slot ticks, init-value: 0;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  define method atomic (v, outer :: &amp;lt;runtime&amp;gt;)&lt;br /&gt;
  update(outer, ticks: add1(outer.ticks))&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  define method compound-initial (outer :: &amp;lt;runtime&amp;gt;)&lt;br /&gt;
  update(outer, ticks: add1(outer.ticks))&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
It is convenient to have default behaviors for atomic, compound-initial, and compound-rest that simply &amp;quot;thread&amp;quot; meta-information through the computations. The inherited definition of compound-rest suffices. Now suppose we want to evaluate some [http://en.wikipedia.org/wiki/Expression_%28programming%29 expression] E without counting its cost. We could use the reify and reflect operations like this:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  let r = reify(&amp;lt;runtime&amp;gt;);&lt;br /&gt;
  let result = E;&lt;br /&gt;
  reflect(&amp;lt;runtime&amp;gt;, r, result);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Here we capture the expense meta-information before evaluating E and save it as r. After evaluating E, we restore the old meta-information. The result from evaluating E is returned. Of course, any time we want to know the cumulative expense for the program, we can examine reify(&amp;lt;runtime&amp;gt;).ticks[4]. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Java and Ruby are two examples of popular programming languages that are inherently reflective, and therefore could be used to implement an ROP paradigm.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''References'''''&lt;br /&gt;
&lt;br /&gt;
[1] Reflection (Computer Science), Wikipedia: http://en.wikipedia.org/wiki/Reflection_%28computer_science%29 &amp;lt;br&amp;gt;&lt;br /&gt;
[2] Using Java Reflection, Sun: http://java.sun.com/developer/technicalArticles/ALT/Reflection/&amp;lt;br&amp;gt;&lt;br /&gt;
[3] List of reflective programming languages and platforms, Wikipedia: http://en.wikipedia.org/wiki/List_of_reflective_programming_languages_and_platforms&amp;lt;br&amp;gt;&lt;br /&gt;
[4] An Introduction to Reflection-Oriented Programming, Sobel &amp;amp; Friedman: http://www2.parc.com/csl/groups/sda/projects/reflection96/docs/sobel/sobel.pdf&amp;lt;br&amp;gt;&lt;br /&gt;
[5] What is Metainformation?: http://searchoracle.techtarget.com/sDefinition/0,,sid41_gci900705,00.html&amp;lt;br&amp;gt;&lt;br /&gt;
[6] Metaprogramming, Wikipedia: http://en.wikipedia.org/wiki/Metaprogramming&lt;/div&gt;</summary>
		<author><name>Discostu</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki2pthelm&amp;diff=25790</id>
		<title>CSC/ECE 517 Fall 2009/wiki2pthelm</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki2pthelm&amp;diff=25790"/>
		<updated>2009-10-13T18:47:42Z</updated>

		<summary type="html">&lt;p&gt;Discostu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''Reflection-Oriented Programming''' ==&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Reflection-Oriented Programming''' &amp;lt;b&amp;gt;(ROP)&amp;lt;/b&amp;gt;, or &amp;quot;reflective programming&amp;quot;, is defined as a programming model design with the intent to analyze and improve it's structure, performance or other implementation aspects during runtime (implying no prior knowledge of the source), as opposed to compile time. ROP is a natural extension to [http://en.wikipedia.org/wiki/Object-oriented_programming object-oriented programming].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''''Concepts'''''==&lt;br /&gt;
&lt;br /&gt;
Two key concepts of ROP are meta-information, which is the state of the program at execution time, and metaprogramming, which is the idea that a language can act as it's own reflection. In other words, a language can reflect (modify) itself. More precisely, we define reflection-oriented programming to be a programming style that uses any means available (reflection or otherwise) to extend the meta-information in order to avoid situations in which a local program's requirements leads to non-local rewriting of said program [4]. Additionally, the ROP concepts extends reflection, in that it can make decisions on the architecture of the system, rather than just methods and variables.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''''Reflection vs. ROP'''''==&lt;br /&gt;
&lt;br /&gt;
Reflection is the process by which a computer program can observe and modify it's own structure and behavior[1]. It allows an executing program to examine or &amp;quot;introspect&amp;quot; upon itself, and manipulate internal properties of the program[2]. Java, Ruby and .NET are among the most popular reflective languages, however there are many others[3]. Although reflection is the primary concept behind ROP, it does not necessarily preclude the existence of ROP. ROP is a concept of design; as with most designs, it is not necessarily dependent on the implementation. As an example, computational programming can also be used to implement the concepts of ROP, and does not assume the presence of source code at runtime, something that is essential to the concept of reflection[4].&lt;br /&gt;
&lt;br /&gt;
The ROP metaprogramming model sequences are defined as either atomic (simple) or compound (multi-atomic). These sequences take advantage of meta-information that retains knowledge of program structure, which is different than a classic object-oriented program that can lose said structure after compilation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''''Meta-Information'''''==&lt;br /&gt;
&lt;br /&gt;
Meta-Information, or metadata, is the state of the program at execution time. Phrased another way, Meta-information is information about information. For example, a if a document is considered to be information, its title, location, and subject are examples of meta-information[5]. Meta-Information is essential not only for reflection but for the concepts of ROP to be implemented correctly. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''''Metaprogramming'''''==&lt;br /&gt;
&lt;br /&gt;
Metaprogramming introduces the concept of &amp;quot;programs that write programs&amp;quot;. Reflection is one type of metaprogramming, and therefore can be considered as an option when attempting to design a system or program based on the concepts defined by ROP. Metaprograms are written in Metalanguage[6], which to be considered for ROP would be defined as the same or alternate language as the system or program to be implemented. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''''Examples'''''==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;''Simple Reflection''&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As an example, first let us review what reflection looks like as an implementation. To see how reflection works, consider this simple example, taken from [http://java.sun.com/developer/technicalArticles/ALT/Reflection/ Using Java Reflection]:&lt;br /&gt;
&lt;br /&gt;
   import java.lang.reflect.*;&lt;br /&gt;
 &lt;br /&gt;
   public class DumpMethods {&lt;br /&gt;
      public static void main(String args[])&lt;br /&gt;
      {&lt;br /&gt;
         try {&lt;br /&gt;
            Class c = Class.forName(args[0]);&lt;br /&gt;
            Method m[] = c.getDeclaredMethods();&lt;br /&gt;
            for (int i = 0; i &amp;lt; m.length; i++)&lt;br /&gt;
            System.out.println(m[i].toString());&lt;br /&gt;
         }&lt;br /&gt;
         catch (Throwable e) {&lt;br /&gt;
            System.err.println(e);&lt;br /&gt;
         }&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For an invocation of:&lt;br /&gt;
&lt;br /&gt;
  java DumpMethods java.util.Stack&lt;br /&gt;
&lt;br /&gt;
the output is:&lt;br /&gt;
&lt;br /&gt;
  public java.lang.Object java.util.Stack.push(&lt;br /&gt;
    java.lang.Object)&lt;br /&gt;
   public synchronized &lt;br /&gt;
     java.lang.Object java.util.Stack.pop()&lt;br /&gt;
   public synchronized&lt;br /&gt;
      java.lang.Object java.util.Stack.peek()&lt;br /&gt;
   public boolean java.util.Stack.empty()&lt;br /&gt;
   public synchronized &lt;br /&gt;
     int java.util.Stack.search(java.lang.Object)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
That is, the method names of class java.util.Stack are listed, along with their fully qualified parameter and return types.&lt;br /&gt;
&lt;br /&gt;
This program loads the specified class using class.forName, and then calls getDeclaredMethods to retrieve the list of methods defined in the class. java.lang.reflect.Method is a class representing a single class method. Reflection is useful because it supports dynamic retrieval of information about classes and data structures by name, and allows for their manipulation within an executing program[2].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;''ROP''&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ROP is more than just simple reflection (although technically, it can be reflection alone), it is also analyzation or improvement at runtime without prior knowledge of source. A good example of this concept is Measuring Computational Expense from the document [http://www2.parc.com/csl/groups/sda/projects/reflection96/docs/sobel/sobel.pdf An Introduction to Reflection-Oriented Programming]. To implement such behavior, we need only these definitions:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  define reflective &amp;lt;runtime&amp;gt; (&amp;lt;simple-reflective&amp;gt;)&lt;br /&gt;
  slot ticks, init-value: 0;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  define method atomic (v, outer :: &amp;lt;runtime&amp;gt;)&lt;br /&gt;
  update(outer, ticks: add1(outer.ticks))&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  define method compound-initial (outer :: &amp;lt;runtime&amp;gt;)&lt;br /&gt;
  update(outer, ticks: add1(outer.ticks))&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
It is convenient to have default behaviors for atomic, compound-initial, and compound-rest that simply &amp;quot;thread&amp;quot; meta-information through the computations. The inherited definition of compound-rest suffices. Now suppose we want to evaluate some expression E without counting its cost. We could use the reify and reflect operations like this:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  let r = reify(&amp;lt;runtime&amp;gt;);&lt;br /&gt;
  let result = E;&lt;br /&gt;
  reflect(&amp;lt;runtime&amp;gt;, r, result);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Here we capture the expense meta-information before evaluating E and save it as r. After evaluating E, we restore the old meta-information. The result from evaluating E is returned. Of course, any time we want to know the cumulative expense for the program, we can examine reify(&amp;lt;runtime&amp;gt;).ticks[4]. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Java and Ruby are two examples of popular programming languages that are inherently reflective, and therefore could be used to implement an ROP paradigm.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''References'''''&lt;br /&gt;
&lt;br /&gt;
[1] Reflection (Computer Science), Wikipedia: http://en.wikipedia.org/wiki/Reflection_%28computer_science%29 &amp;lt;br&amp;gt;&lt;br /&gt;
[2] Using Java Reflection, Sun: http://java.sun.com/developer/technicalArticles/ALT/Reflection/&amp;lt;br&amp;gt;&lt;br /&gt;
[3] List of reflective programming languages and platforms, Wikipedia: http://en.wikipedia.org/wiki/List_of_reflective_programming_languages_and_platforms&amp;lt;br&amp;gt;&lt;br /&gt;
[4] An Introduction to Reflection-Oriented Programming, Sobel &amp;amp; Friedman: http://www2.parc.com/csl/groups/sda/projects/reflection96/docs/sobel/sobel.pdf&amp;lt;br&amp;gt;&lt;br /&gt;
[5] What is Metainformation?: http://searchoracle.techtarget.com/sDefinition/0,,sid41_gci900705,00.html&amp;lt;br&amp;gt;&lt;br /&gt;
[6] Metaprogramming, Wikipedia: http://en.wikipedia.org/wiki/Metaprogramming&lt;/div&gt;</summary>
		<author><name>Discostu</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki2pthelm&amp;diff=25789</id>
		<title>CSC/ECE 517 Fall 2009/wiki2pthelm</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki2pthelm&amp;diff=25789"/>
		<updated>2009-10-13T18:44:25Z</updated>

		<summary type="html">&lt;p&gt;Discostu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''Reflection-Oriented Programming''' ==&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Reflection-Oriented Programming''' &amp;lt;b&amp;gt;(ROP)&amp;lt;/b&amp;gt;, or &amp;quot;reflective programming&amp;quot;, is defined as a programming model design with the intent to analyze and improve it's structure, performance or other implementation aspects during runtime (implying no prior knowledge of the source), as opposed to compile time. ROP is a natural extension to object-oriented programming.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''''Concepts'''''==&lt;br /&gt;
&lt;br /&gt;
Two key concepts of ROP are meta-information, which is the state of the program at execution time, and metaprogramming, which is the idea that a language can act as it's own reflection. In other words, a language can reflect (modify) itself. More precisely, we define reflection-oriented programming to be a programming style that uses any means available (reflection or otherwise) to extend the meta-information in order to avoid situations in which a local program's requirements leads to non-local rewriting of said program [4]. Additionally, the ROP concepts extends reflection, in that it can make decisions on the architecture of the system, rather than just methods and variables.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''''Reflection vs. ROP'''''==&lt;br /&gt;
&lt;br /&gt;
Reflection is the process by which a computer program can observe and modify it's own structure and behavior[1]. It allows an executing program to examine or &amp;quot;introspect&amp;quot; upon itself, and manipulate internal properties of the program[2]. Java, Ruby and .NET are among the most popular reflective languages, however there are many others[3]. Although reflection is the primary concept behind ROP, it does not necessarily preclude the existence of ROP. ROP is a concept of design; as with most designs, it is not necessarily dependent on the implementation. As an example, computational programming can also be used to implement the concepts of ROP, and does not assume the presence of source code at runtime, something that is essential to the concept of reflection[4].&lt;br /&gt;
&lt;br /&gt;
The ROP metaprogramming model sequences are defined as either atomic (simple) or compound (multi-atomic). These sequences take advantage of meta-information that retains knowledge of program structure, which is different than a classic object-oriented program that can lose said structure after compilation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''''Meta-Information'''''==&lt;br /&gt;
&lt;br /&gt;
Meta-Information, or metadata, is the state of the program at execution time. Phrased another way, Meta-information is information about information. For example, a if a document is considered to be information, its title, location, and subject are examples of meta-information[5]. Meta-Information is essential not only for reflection but for the concepts of ROP to be implemented correctly. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''''Metaprogramming'''''==&lt;br /&gt;
&lt;br /&gt;
Metaprogramming introduces the concept of &amp;quot;programs that write programs&amp;quot;. Reflection is one type of metaprogramming, and therefore can be considered as an option when attempting to design a system or program based on the concepts defined by ROP. Metaprograms are written in Metalanguage[6], which to be considered for ROP would be defined as the same or alternate language as the system or program to be implemented. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''''Examples'''''==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;''Simple Reflection''&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As an example, first let us review what reflection looks like as an implementation. To see how reflection works, consider this simple example, taken from [http://java.sun.com/developer/technicalArticles/ALT/Reflection/ Using Java Reflection]:&lt;br /&gt;
&lt;br /&gt;
   import java.lang.reflect.*;&lt;br /&gt;
 &lt;br /&gt;
   public class DumpMethods {&lt;br /&gt;
      public static void main(String args[])&lt;br /&gt;
      {&lt;br /&gt;
         try {&lt;br /&gt;
            Class c = Class.forName(args[0]);&lt;br /&gt;
            Method m[] = c.getDeclaredMethods();&lt;br /&gt;
            for (int i = 0; i &amp;lt; m.length; i++)&lt;br /&gt;
            System.out.println(m[i].toString());&lt;br /&gt;
         }&lt;br /&gt;
         catch (Throwable e) {&lt;br /&gt;
            System.err.println(e);&lt;br /&gt;
         }&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For an invocation of:&lt;br /&gt;
&lt;br /&gt;
  java DumpMethods java.util.Stack&lt;br /&gt;
&lt;br /&gt;
the output is:&lt;br /&gt;
&lt;br /&gt;
  public java.lang.Object java.util.Stack.push(&lt;br /&gt;
    java.lang.Object)&lt;br /&gt;
   public synchronized &lt;br /&gt;
     java.lang.Object java.util.Stack.pop()&lt;br /&gt;
   public synchronized&lt;br /&gt;
      java.lang.Object java.util.Stack.peek()&lt;br /&gt;
   public boolean java.util.Stack.empty()&lt;br /&gt;
   public synchronized &lt;br /&gt;
     int java.util.Stack.search(java.lang.Object)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
That is, the method names of class java.util.Stack are listed, along with their fully qualified parameter and return types.&lt;br /&gt;
&lt;br /&gt;
This program loads the specified class using class.forName, and then calls getDeclaredMethods to retrieve the list of methods defined in the class. java.lang.reflect.Method is a class representing a single class method. Reflection is useful because it supports dynamic retrieval of information about classes and data structures by name, and allows for their manipulation within an executing program[2].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;''ROP''&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ROP is more than just simple reflection (although technically, it can be reflection alone), it is also analyzation or improvement at runtime without prior knowledge of source. A good example of this concept is Measuring Computational Expense from the document [http://www2.parc.com/csl/groups/sda/projects/reflection96/docs/sobel/sobel.pdf An Introduction to Reflection-Oriented Programming]. To implement such behavior, we need only these definitions:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  define reflective &amp;lt;runtime&amp;gt; (&amp;lt;simple-reflective&amp;gt;)&lt;br /&gt;
  slot ticks, init-value: 0;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  define method atomic (v, outer :: &amp;lt;runtime&amp;gt;)&lt;br /&gt;
  update(outer, ticks: add1(outer.ticks))&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  define method compound-initial (outer :: &amp;lt;runtime&amp;gt;)&lt;br /&gt;
  update(outer, ticks: add1(outer.ticks))&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
It is convenient to have default behaviors for atomic, compound-initial, and compound-rest that simply &amp;quot;thread&amp;quot; meta-information through the computations. The inherited definition of compound-rest suffices. Now suppose we want to evaluate some expression E without counting its cost. We could use the reify and reflect operations like this:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  let r = reify(&amp;lt;runtime&amp;gt;);&lt;br /&gt;
  let result = E;&lt;br /&gt;
  reflect(&amp;lt;runtime&amp;gt;, r, result);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Here we capture the expense meta-information before evaluating E and save it as r. After evaluating E, we restore the old meta-information. The result from evaluating E is returned. Of course, any time we want to know the cumulative expense for the program, we can examine reify(&amp;lt;runtime&amp;gt;).ticks[4]. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Java and Ruby are two examples of popular programming languages that are inherently reflective, and therefore could be used to implement an ROP paradigm.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''References'''''&lt;br /&gt;
&lt;br /&gt;
[1] Reflection (Computer Science), Wikipedia: http://en.wikipedia.org/wiki/Reflection_%28computer_science%29 &amp;lt;br&amp;gt;&lt;br /&gt;
[2] Using Java Reflection, Sun: http://java.sun.com/developer/technicalArticles/ALT/Reflection/&amp;lt;br&amp;gt;&lt;br /&gt;
[3] List of reflective programming languages and platforms, Wikipedia: http://en.wikipedia.org/wiki/List_of_reflective_programming_languages_and_platforms&amp;lt;br&amp;gt;&lt;br /&gt;
[4] An Introduction to Reflection-Oriented Programming, Sobel &amp;amp; Friedman: http://www2.parc.com/csl/groups/sda/projects/reflection96/docs/sobel/sobel.pdf&amp;lt;br&amp;gt;&lt;br /&gt;
[5] What is Metainformation?: http://searchoracle.techtarget.com/sDefinition/0,,sid41_gci900705,00.html&amp;lt;br&amp;gt;&lt;br /&gt;
[6] Metaprogramming, Wikipedia: http://en.wikipedia.org/wiki/Metaprogramming&lt;/div&gt;</summary>
		<author><name>Discostu</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki2pthelm&amp;diff=25788</id>
		<title>CSC/ECE 517 Fall 2009/wiki2pthelm</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki2pthelm&amp;diff=25788"/>
		<updated>2009-10-13T18:41:38Z</updated>

		<summary type="html">&lt;p&gt;Discostu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''Reflection-Oriented Programming''' ==&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Reflection-Oriented Programming''' &amp;lt;b&amp;gt;(ROP)&amp;lt;/b&amp;gt;, or &amp;quot;reflective programming&amp;quot;, is defined as a programming model design with the intent to analyze and improve it's structure, performance or other implementation aspects during runtime (implying no prior knowledge of the source), as opposed to compile time. ROP is a natural extension to object-oriented programming.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''''Concepts'''''==&lt;br /&gt;
&lt;br /&gt;
Two key concepts of ROP are meta-information, which is the state of the program at execution time, and metaprogramming, which is the idea that a language can act as it's own reflection. In other words, a language can reflect (modify) itself. More precisely, we define reflection-oriented programming to be a programming style that uses any means available (reflection or otherwise) to extend the meta-information in order to avoid situations in which a local program's requirements leads to non-local rewriting of said program [4]. Additionally, the ROP concepts extends reflection, in that it can make decisions on the architecture of the system, rather than just methods and variables.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''''Reflection vs. ROP'''''==&lt;br /&gt;
&lt;br /&gt;
Reflection is the process by which a computer program can observe and modify it's own structure and behavior[1]. It allows an executing program to examine or &amp;quot;introspect&amp;quot; upon itself, and manipulate internal properties of the program[2]. Java, Ruby and .NET are among the most popular reflective languages, however there are many others[3]. Although reflection is the primary concept behind ROP, it does not necessarily preclude the existence of ROP. ROP is a concept of design; as with most designs, it is not necessarily dependent on the implementation. As an example, computational programming can also be used to implement the concepts of ROP, and does not assume the presence of source code at runtime, something that is essential to the concept of reflection[4].&lt;br /&gt;
&lt;br /&gt;
The ROP metaprogramming model sequences are defined as either atomic (simple) or compound (multi-atomic). These sequences take advantage of meta-information that retains knowledge of program structure, which is different than a classic object-oriented program that can lose said structure after compilation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''''Meta-Information'''''==&lt;br /&gt;
&lt;br /&gt;
Meta-Information, or metadata, is the state of the program at execution time. Phrased another way, Meta-information is information about information. For example, a if a document is considered to be information, its title, location, and subject are examples of meta-information[5]. Meta-Information is essential not only for reflection but for the concepts of ROP to be implemented correctly. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''''Metaprogramming'''''==&lt;br /&gt;
&lt;br /&gt;
Metaprogramming introduces the concept of &amp;quot;programs that write programs&amp;quot;. Reflection is one type of metaprogramming, and therefore can be considered as an option when attempting to design a system or program based on the concepts defined by ROP. Metaprograms are written in Metalanguage[6], which to be considered for ROP would be defined as the same or alternate language as the system or program to be implemented. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''''Examples'''''==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;''Simple Reflection''&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As an example, first let us review what reflection looks like as an implementation. To see how reflection works, consider this simple example, taken from [http://java.sun.com/developer/technicalArticles/ALT/Reflection/ Using Java Reflection]:&lt;br /&gt;
&lt;br /&gt;
   import java.lang.reflect.*;&lt;br /&gt;
 &lt;br /&gt;
   public class DumpMethods {&lt;br /&gt;
      public static void main(String args[])&lt;br /&gt;
      {&lt;br /&gt;
         try {&lt;br /&gt;
            Class c = Class.forName(args[0]);&lt;br /&gt;
            Method m[] = c.getDeclaredMethods();&lt;br /&gt;
            for (int i = 0; i &amp;lt; m.length; i++)&lt;br /&gt;
            System.out.println(m[i].toString());&lt;br /&gt;
         }&lt;br /&gt;
         catch (Throwable e) {&lt;br /&gt;
            System.err.println(e);&lt;br /&gt;
         }&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For an invocation of:&lt;br /&gt;
&lt;br /&gt;
  java DumpMethods java.util.Stack&lt;br /&gt;
&lt;br /&gt;
the output is:&lt;br /&gt;
&lt;br /&gt;
  public java.lang.Object java.util.Stack.push(&lt;br /&gt;
    java.lang.Object)&lt;br /&gt;
   public synchronized &lt;br /&gt;
     java.lang.Object java.util.Stack.pop()&lt;br /&gt;
   public synchronized&lt;br /&gt;
      java.lang.Object java.util.Stack.peek()&lt;br /&gt;
   public boolean java.util.Stack.empty()&lt;br /&gt;
   public synchronized &lt;br /&gt;
     int java.util.Stack.search(java.lang.Object)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
That is, the method names of class java.util.Stack are listed, along with their fully qualified parameter and return types.&lt;br /&gt;
&lt;br /&gt;
This program loads the specified class using class.forName, and then calls getDeclaredMethods to retrieve the list of methods defined in the class. java.lang.reflect.Method is a class representing a single class method. Reflection is useful because it supports dynamic retrieval of information about classes and data structures by name, and allows for their manipulation within an executing program[2].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;''ROP''&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ROP is more than just simple reflection (although technically, it can be reflection alone), it is also analyzation or improvement at runtime without prior knowledge of source. A good example of this concept is Measuring Computational Expense. To implement such behavior, we need only these definitions:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  define reflective &amp;lt;runtime&amp;gt; (&amp;lt;simple-reflective&amp;gt;)&lt;br /&gt;
  slot ticks, init-value: 0;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  define method atomic (v, outer :: &amp;lt;runtime&amp;gt;)&lt;br /&gt;
  update(outer, ticks: add1(outer.ticks))&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  define method compound-initial (outer :: &amp;lt;runtime&amp;gt;)&lt;br /&gt;
  update(outer, ticks: add1(outer.ticks))&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
It is convenient to have default behaviors for atomic, compound-initial, and compound-rest that simply &amp;quot;thread&amp;quot; meta-information through the computations. The inherited definition of compound-rest suffices. Now suppose we want to evaluate some expression E without counting its cost. We could use the reify and reflect operations like this:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  let r = reify(&amp;lt;runtime&amp;gt;);&lt;br /&gt;
  let result = E;&lt;br /&gt;
  reflect(&amp;lt;runtime&amp;gt;, r, result);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Here we capture the expense meta-information before evaluating E and save it as r. After evaluating E, we restore the old meta-information. The result from evaluating E is returned. Of course, any time we want to know the cumulative expense for the program, we can examine reify(&amp;lt;runtime&amp;gt;).ticks[4]. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Java and Ruby are two examples of popular programming languages that are inherently reflective, and therefore could be used to implement an ROP paradigm.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''References'''''&lt;br /&gt;
&lt;br /&gt;
[1] Reflection (Computer Science), Wikipedia: http://en.wikipedia.org/wiki/Reflection_%28computer_science%29 &amp;lt;br&amp;gt;&lt;br /&gt;
[2] Using Java Reflection, Sun: http://java.sun.com/developer/technicalArticles/ALT/Reflection/&amp;lt;br&amp;gt;&lt;br /&gt;
[3] List of reflective programming languages and platforms, Wikipedia: http://en.wikipedia.org/wiki/List_of_reflective_programming_languages_and_platforms&amp;lt;br&amp;gt;&lt;br /&gt;
[4] An Introduction to Reflection-Oriented Programming, Sobel &amp;amp; Friedman: http://www2.parc.com/csl/groups/sda/projects/reflection96/docs/sobel/sobel.pdf&amp;lt;br&amp;gt;&lt;br /&gt;
[5] What is Metainformation?: http://searchoracle.techtarget.com/sDefinition/0,,sid41_gci900705,00.html&amp;lt;br&amp;gt;&lt;br /&gt;
[6] Metaprogramming, Wikipedia: http://en.wikipedia.org/wiki/Metaprogramming&lt;/div&gt;</summary>
		<author><name>Discostu</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki2pthelm&amp;diff=25787</id>
		<title>CSC/ECE 517 Fall 2009/wiki2pthelm</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki2pthelm&amp;diff=25787"/>
		<updated>2009-10-13T18:39:36Z</updated>

		<summary type="html">&lt;p&gt;Discostu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''Reflection-Oriented Programming''' ==&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Reflection-Oriented Programming''' &amp;lt;b&amp;gt;(ROP)&amp;lt;/b&amp;gt;, or &amp;quot;reflective programming&amp;quot;, is defined as a programming model design with the intent to analyze and improve it's structure, performance or other implementation aspects during runtime (implying no prior knowledge of the source), as opposed to compile time. ROP is a natural extension to object-oriented programming.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''''Concepts'''''==&lt;br /&gt;
&lt;br /&gt;
Two key concepts of ROP are meta-information, which is the state of the program at execution time, and metaprogramming, which is the idea that a language can act as it's own reflection. In other words, a language can reflect (modify) itself. More precisely, we define reflection-oriented programming to be a programming style that uses any means available (reflection or otherwise) to extend the meta-information in order to avoid situations in which a local program's requirements leads to non-local rewriting of said program [4]. Additionally, the ROP concepts extends reflection, in that it can make decisions on the architecture of the system, rather than just methods and variables.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''''Reflection vs. ROP'''''==&lt;br /&gt;
&lt;br /&gt;
Reflection is the process by which a computer program can observe and modify it's own structure and behavior[1]. It allows an executing program to examine or &amp;quot;introspect&amp;quot; upon itself, and manipulate internal properties of the program[2]. Java, Ruby and .NET are among the most popular reflective languages, however there are many others[3]. Although reflection is the primary concept behind ROP, it does not necessarily preclude the existence of ROP. ROP is a concept of design; as with most designs, it is not necessarily dependent on the implementation. As an example, computational programming can also be used to implement the concepts of ROP, and does not assume the presence of source code at runtime, something that is essential to the concept of reflection[4].&lt;br /&gt;
&lt;br /&gt;
The ROP metaprogramming model sequences are defined as either atomic (simple) or compound (multi-atomic). These sequences take advantage of meta-information that retains knowledge of program structure, which is different than a classic object-oriented program that can lose said structure after compilation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''''Meta-Information'''''==&lt;br /&gt;
&lt;br /&gt;
Meta-Information, or metadata, is the state of the program at execution time. Phrased another way, Meta-information is information about information. For example, a if a document is considered to be information, its title, location, and subject are examples of meta-information[5]. Meta-Information is essential not only for reflection but for the concepts of ROP to be implemented correctly. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''''Metaprogramming'''''==&lt;br /&gt;
&lt;br /&gt;
Metaprogramming introduces the concept of &amp;quot;programs that write programs&amp;quot;. Reflection is one type of metaprogramming, and therefore can be considered as an option when attempting to design a system or program based on the concepts defined by ROP. Metaprograms are written in Metalanguage[6], which to be considered for ROP would be defined as the same or alternate language as the system or program to be implemented. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''''Examples'''''==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;''Simple Reflection''&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As an example, first let us review what reflection looks like as an implementation. To see how reflection works, consider this simple example, taken from &amp;lt;a href=&amp;quot;http://java.sun.com/developer/technicalArticles/ALT/Reflection/&amp;quot;&amp;gt;Using Java Reflection&amp;lt;/a&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
   import java.lang.reflect.*;&lt;br /&gt;
 &lt;br /&gt;
   public class DumpMethods {&lt;br /&gt;
      public static void main(String args[])&lt;br /&gt;
      {&lt;br /&gt;
         try {&lt;br /&gt;
            Class c = Class.forName(args[0]);&lt;br /&gt;
            Method m[] = c.getDeclaredMethods();&lt;br /&gt;
            for (int i = 0; i &amp;lt; m.length; i++)&lt;br /&gt;
            System.out.println(m[i].toString());&lt;br /&gt;
         }&lt;br /&gt;
         catch (Throwable e) {&lt;br /&gt;
            System.err.println(e);&lt;br /&gt;
         }&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For an invocation of:&lt;br /&gt;
&lt;br /&gt;
  java DumpMethods java.util.Stack&lt;br /&gt;
&lt;br /&gt;
the output is:&lt;br /&gt;
&lt;br /&gt;
  public java.lang.Object java.util.Stack.push(&lt;br /&gt;
    java.lang.Object)&lt;br /&gt;
   public synchronized &lt;br /&gt;
     java.lang.Object java.util.Stack.pop()&lt;br /&gt;
   public synchronized&lt;br /&gt;
      java.lang.Object java.util.Stack.peek()&lt;br /&gt;
   public boolean java.util.Stack.empty()&lt;br /&gt;
   public synchronized &lt;br /&gt;
     int java.util.Stack.search(java.lang.Object)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
That is, the method names of class java.util.Stack are listed, along with their fully qualified parameter and return types.&lt;br /&gt;
&lt;br /&gt;
This program loads the specified class using class.forName, and then calls getDeclaredMethods to retrieve the list of methods defined in the class. java.lang.reflect.Method is a class representing a single class method. Reflection is useful because it supports dynamic retrieval of information about classes and data structures by name, and allows for their manipulation within an executing program[2].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;''ROP''&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ROP is more than just simple reflection (although technically, it can be reflection alone), it is also analyzation or improvement at runtime without prior knowledge of source. A good example of this concept is Measuring Computational Expense. To implement such behavior, we need only these definitions:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  define reflective &amp;lt;runtime&amp;gt; (&amp;lt;simple-reflective&amp;gt;)&lt;br /&gt;
  slot ticks, init-value: 0;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  define method atomic (v, outer :: &amp;lt;runtime&amp;gt;)&lt;br /&gt;
  update(outer, ticks: add1(outer.ticks))&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  define method compound-initial (outer :: &amp;lt;runtime&amp;gt;)&lt;br /&gt;
  update(outer, ticks: add1(outer.ticks))&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
It is convenient to have default behaviors for atomic, compound-initial, and compound-rest that simply &amp;quot;thread&amp;quot; meta-information through the computations. The inherited definition of compound-rest suffices. Now suppose we want to evaluate some expression E without counting its cost. We could use the reify and reflect operations like this:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  let r = reify(&amp;lt;runtime&amp;gt;);&lt;br /&gt;
  let result = E;&lt;br /&gt;
  reflect(&amp;lt;runtime&amp;gt;, r, result);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Here we capture the expense meta-information before evaluating E and save it as r. After evaluating E, we restore the old meta-information. The result from evaluating E is returned. Of course, any time we want to know the cumulative expense for the program, we can examine reify(&amp;lt;runtime&amp;gt;).ticks[4]. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Java and Ruby are two examples of popular programming languages that are inherently reflective, and therefore could be used to implement an ROP paradigm.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''References'''''&lt;br /&gt;
&lt;br /&gt;
[1] Reflection (Computer Science), Wikipedia: http://en.wikipedia.org/wiki/Reflection_%28computer_science%29 &amp;lt;br&amp;gt;&lt;br /&gt;
[2] Using Java Reflection, Sun: http://java.sun.com/developer/technicalArticles/ALT/Reflection/&amp;lt;br&amp;gt;&lt;br /&gt;
[3] List of reflective programming languages and platforms, Wikipedia: http://en.wikipedia.org/wiki/List_of_reflective_programming_languages_and_platforms&amp;lt;br&amp;gt;&lt;br /&gt;
[4] An Introduction to Reflection-Oriented Programming, Sobel &amp;amp; Friedman: http://www2.parc.com/csl/groups/sda/projects/reflection96/docs/sobel/sobel.pdf&amp;lt;br&amp;gt;&lt;br /&gt;
[5] What is Metainformation?: http://searchoracle.techtarget.com/sDefinition/0,,sid41_gci900705,00.html&amp;lt;br&amp;gt;&lt;br /&gt;
[6] Metaprogramming, Wikipedia: http://en.wikipedia.org/wiki/Metaprogramming&lt;/div&gt;</summary>
		<author><name>Discostu</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki2pthelm&amp;diff=25786</id>
		<title>CSC/ECE 517 Fall 2009/wiki2pthelm</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki2pthelm&amp;diff=25786"/>
		<updated>2009-10-13T18:38:00Z</updated>

		<summary type="html">&lt;p&gt;Discostu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''Reflection-Oriented Programming''' ==&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Reflection-Oriented Programming''' &amp;lt;b&amp;gt;(ROP)&amp;lt;/b&amp;gt;, or &amp;quot;reflective programming&amp;quot;, is defined as a programming model design with the intent to analyze and improve it's structure, performance or other implementation aspects during runtime (implying no prior knowledge of the source), as opposed to compile time. ROP is a natural extension to object-oriented programming.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''''Concepts'''''==&lt;br /&gt;
&lt;br /&gt;
Two key concepts of ROP are meta-information, which is the state of the program at execution time, and metaprogramming, which is the idea that a language can act as it's own reflection. In other words, a language can reflect (modify) itself. More precisely, we define reflection-oriented programming to be a programming style that uses any means available (reflection or otherwise) to extend the meta-information in order to avoid situations in which a local program's requirements leads to non-local rewriting of said program [4]. Additionally, the ROP concepts extends reflection, in that it can make decisions on the architecture of the system, rather than just methods and variables.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Reflection vs. ROP'''''&lt;br /&gt;
&lt;br /&gt;
Reflection is the process by which a computer program can observe and modify it's own structure and behavior[1]. It allows an executing program to examine or &amp;quot;introspect&amp;quot; upon itself, and manipulate internal properties of the program[2]. Java, Ruby and .NET are among the most popular reflective languages, however there are many others[3]. Although reflection is the primary concept behind ROP, it does not necessarily preclude the existence of ROP. ROP is a concept of design; as with most designs, it is not necessarily dependent on the implementation. As an example, computational programming can also be used to implement the concepts of ROP, and does not assume the presence of source code at runtime, something that is essential to the concept of reflection[4].&lt;br /&gt;
&lt;br /&gt;
The ROP metaprogramming model sequences are defined as either atomic (simple) or compound (multi-atomic). These sequences take advantage of meta-information that retains knowledge of program structure, which is different than a classic object-oriented program that can lose said structure after compilation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Meta-Information'''''&lt;br /&gt;
&lt;br /&gt;
Meta-Information, or metadata, is the state of the program at execution time. Phrased another way, Meta-information is information about information. For example, a if a document is considered to be information, its title, location, and subject are examples of meta-information[5]. Meta-Information is essential not only for reflection but for the concepts of ROP to be implemented correctly. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Metaprogramming'''''&lt;br /&gt;
&lt;br /&gt;
Metaprogramming introduces the concept of &amp;quot;programs that write programs&amp;quot;. Reflection is one type of metaprogramming, and therefore can be considered as an option when attempting to design a system or program based on the concepts defined by ROP. Metaprograms are written in Metalanguage[6], which to be considered for ROP would be defined as the same or alternate language as the system or program to be implemented. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Examples'''''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;''Simple Reflection''&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As an example, first let us review what reflection looks like as an implementation. To see how reflection works, consider this simple example:&lt;br /&gt;
&lt;br /&gt;
   import java.lang.reflect.*;&lt;br /&gt;
 &lt;br /&gt;
   public class DumpMethods {&lt;br /&gt;
      public static void main(String args[])&lt;br /&gt;
      {&lt;br /&gt;
         try {&lt;br /&gt;
            Class c = Class.forName(args[0]);&lt;br /&gt;
            Method m[] = c.getDeclaredMethods();&lt;br /&gt;
            for (int i = 0; i &amp;lt; m.length; i++)&lt;br /&gt;
            System.out.println(m[i].toString());&lt;br /&gt;
         }&lt;br /&gt;
         catch (Throwable e) {&lt;br /&gt;
            System.err.println(e);&lt;br /&gt;
         }&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For an invocation of:&lt;br /&gt;
&lt;br /&gt;
  java DumpMethods java.util.Stack&lt;br /&gt;
&lt;br /&gt;
the output is:&lt;br /&gt;
&lt;br /&gt;
  public java.lang.Object java.util.Stack.push(&lt;br /&gt;
    java.lang.Object)&lt;br /&gt;
   public synchronized &lt;br /&gt;
     java.lang.Object java.util.Stack.pop()&lt;br /&gt;
   public synchronized&lt;br /&gt;
      java.lang.Object java.util.Stack.peek()&lt;br /&gt;
   public boolean java.util.Stack.empty()&lt;br /&gt;
   public synchronized &lt;br /&gt;
     int java.util.Stack.search(java.lang.Object)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
That is, the method names of class java.util.Stack are listed, along with their fully qualified parameter and return types.&lt;br /&gt;
&lt;br /&gt;
This program loads the specified class using class.forName, and then calls getDeclaredMethods to retrieve the list of methods defined in the class. java.lang.reflect.Method is a class representing a single class method. Reflection is useful because it supports dynamic retrieval of information about classes and data structures by name, and allows for their manipulation within an executing program[2].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;''ROP''&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ROP is more than just simple reflection (although technically, it can be reflection alone), it is also analyzation or improvement at runtime without prior knowledge of source. A good example of this concept is Measuring Computational Expense. To implement such behavior, we need only these definitions:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  define reflective &amp;lt;runtime&amp;gt; (&amp;lt;simple-reflective&amp;gt;)&lt;br /&gt;
  slot ticks, init-value: 0;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  define method atomic (v, outer :: &amp;lt;runtime&amp;gt;)&lt;br /&gt;
  update(outer, ticks: add1(outer.ticks))&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  define method compound-initial (outer :: &amp;lt;runtime&amp;gt;)&lt;br /&gt;
  update(outer, ticks: add1(outer.ticks))&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
It is convenient to have default behaviors for atomic, compound-initial, and compound-rest that simply &amp;quot;thread&amp;quot; meta-information through the computations. The inherited definition of compound-rest suffices. Now suppose we want to evaluate some expression E without counting its cost. We could use the reify and reflect operations like this:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  let r = reify(&amp;lt;runtime&amp;gt;);&lt;br /&gt;
  let result = E;&lt;br /&gt;
  reflect(&amp;lt;runtime&amp;gt;, r, result);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Here we capture the expense meta-information before evaluating E and save it as r. After evaluating E, we restore the old meta-information. The result from evaluating E is returned. Of course, any time we want to know the cumulative expense for the program, we can examine reify(&amp;lt;runtime&amp;gt;).ticks[4]. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Java and Ruby are two examples of popular programming languages that are inherently reflective, and therefore could be used to implement an ROP paradigm.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''References'''''&lt;br /&gt;
&lt;br /&gt;
[1] Reflection (Computer Science), Wikipedia: http://en.wikipedia.org/wiki/Reflection_%28computer_science%29 &amp;lt;br&amp;gt;&lt;br /&gt;
[2] Using Java Reflection, Sun: http://java.sun.com/developer/technicalArticles/ALT/Reflection/&amp;lt;br&amp;gt;&lt;br /&gt;
[3] List of reflective programming languages and platforms, Wikipedia: http://en.wikipedia.org/wiki/List_of_reflective_programming_languages_and_platforms&amp;lt;br&amp;gt;&lt;br /&gt;
[4] An Introduction to Reflection-Oriented Programming, Sobel &amp;amp; Friedman: http://www2.parc.com/csl/groups/sda/projects/reflection96/docs/sobel/sobel.pdf&amp;lt;br&amp;gt;&lt;br /&gt;
[5] What is Metainformation?: http://searchoracle.techtarget.com/sDefinition/0,,sid41_gci900705,00.html&amp;lt;br&amp;gt;&lt;br /&gt;
[6] Metaprogramming, Wikipedia: http://en.wikipedia.org/wiki/Metaprogramming&lt;/div&gt;</summary>
		<author><name>Discostu</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki2pthelm&amp;diff=25785</id>
		<title>CSC/ECE 517 Fall 2009/wiki2pthelm</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki2pthelm&amp;diff=25785"/>
		<updated>2009-10-13T18:37:45Z</updated>

		<summary type="html">&lt;p&gt;Discostu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''Reflection-Oriented Programming''' ==&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''Reflection-Oriented Programming'''== &amp;lt;b&amp;gt;(ROP)&amp;lt;/b&amp;gt;, or &amp;quot;reflective programming&amp;quot;, is defined as a programming model design with the intent to analyze and improve it's structure, performance or other implementation aspects during runtime (implying no prior knowledge of the source), as opposed to compile time. ROP is a natural extension to object-oriented programming.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Concepts'''''&lt;br /&gt;
&lt;br /&gt;
Two key concepts of ROP are meta-information, which is the state of the program at execution time, and metaprogramming, which is the idea that a language can act as it's own reflection. In other words, a language can reflect (modify) itself. More precisely, we define reflection-oriented programming to be a programming style that uses any means available (reflection or otherwise) to extend the meta-information in order to avoid situations in which a local program's requirements leads to non-local rewriting of said program [4]. Additionally, the ROP concepts extends reflection, in that it can make decisions on the architecture of the system, rather than just methods and variables.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Reflection vs. ROP'''''&lt;br /&gt;
&lt;br /&gt;
Reflection is the process by which a computer program can observe and modify it's own structure and behavior[1]. It allows an executing program to examine or &amp;quot;introspect&amp;quot; upon itself, and manipulate internal properties of the program[2]. Java, Ruby and .NET are among the most popular reflective languages, however there are many others[3]. Although reflection is the primary concept behind ROP, it does not necessarily preclude the existence of ROP. ROP is a concept of design; as with most designs, it is not necessarily dependent on the implementation. As an example, computational programming can also be used to implement the concepts of ROP, and does not assume the presence of source code at runtime, something that is essential to the concept of reflection[4].&lt;br /&gt;
&lt;br /&gt;
The ROP metaprogramming model sequences are defined as either atomic (simple) or compound (multi-atomic). These sequences take advantage of meta-information that retains knowledge of program structure, which is different than a classic object-oriented program that can lose said structure after compilation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Meta-Information'''''&lt;br /&gt;
&lt;br /&gt;
Meta-Information, or metadata, is the state of the program at execution time. Phrased another way, Meta-information is information about information. For example, a if a document is considered to be information, its title, location, and subject are examples of meta-information[5]. Meta-Information is essential not only for reflection but for the concepts of ROP to be implemented correctly. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Metaprogramming'''''&lt;br /&gt;
&lt;br /&gt;
Metaprogramming introduces the concept of &amp;quot;programs that write programs&amp;quot;. Reflection is one type of metaprogramming, and therefore can be considered as an option when attempting to design a system or program based on the concepts defined by ROP. Metaprograms are written in Metalanguage[6], which to be considered for ROP would be defined as the same or alternate language as the system or program to be implemented. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Examples'''''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;''Simple Reflection''&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As an example, first let us review what reflection looks like as an implementation. To see how reflection works, consider this simple example:&lt;br /&gt;
&lt;br /&gt;
   import java.lang.reflect.*;&lt;br /&gt;
 &lt;br /&gt;
   public class DumpMethods {&lt;br /&gt;
      public static void main(String args[])&lt;br /&gt;
      {&lt;br /&gt;
         try {&lt;br /&gt;
            Class c = Class.forName(args[0]);&lt;br /&gt;
            Method m[] = c.getDeclaredMethods();&lt;br /&gt;
            for (int i = 0; i &amp;lt; m.length; i++)&lt;br /&gt;
            System.out.println(m[i].toString());&lt;br /&gt;
         }&lt;br /&gt;
         catch (Throwable e) {&lt;br /&gt;
            System.err.println(e);&lt;br /&gt;
         }&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For an invocation of:&lt;br /&gt;
&lt;br /&gt;
  java DumpMethods java.util.Stack&lt;br /&gt;
&lt;br /&gt;
the output is:&lt;br /&gt;
&lt;br /&gt;
  public java.lang.Object java.util.Stack.push(&lt;br /&gt;
    java.lang.Object)&lt;br /&gt;
   public synchronized &lt;br /&gt;
     java.lang.Object java.util.Stack.pop()&lt;br /&gt;
   public synchronized&lt;br /&gt;
      java.lang.Object java.util.Stack.peek()&lt;br /&gt;
   public boolean java.util.Stack.empty()&lt;br /&gt;
   public synchronized &lt;br /&gt;
     int java.util.Stack.search(java.lang.Object)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
That is, the method names of class java.util.Stack are listed, along with their fully qualified parameter and return types.&lt;br /&gt;
&lt;br /&gt;
This program loads the specified class using class.forName, and then calls getDeclaredMethods to retrieve the list of methods defined in the class. java.lang.reflect.Method is a class representing a single class method. Reflection is useful because it supports dynamic retrieval of information about classes and data structures by name, and allows for their manipulation within an executing program[2].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;''ROP''&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ROP is more than just simple reflection (although technically, it can be reflection alone), it is also analyzation or improvement at runtime without prior knowledge of source. A good example of this concept is Measuring Computational Expense. To implement such behavior, we need only these definitions:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  define reflective &amp;lt;runtime&amp;gt; (&amp;lt;simple-reflective&amp;gt;)&lt;br /&gt;
  slot ticks, init-value: 0;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  define method atomic (v, outer :: &amp;lt;runtime&amp;gt;)&lt;br /&gt;
  update(outer, ticks: add1(outer.ticks))&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  define method compound-initial (outer :: &amp;lt;runtime&amp;gt;)&lt;br /&gt;
  update(outer, ticks: add1(outer.ticks))&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
It is convenient to have default behaviors for atomic, compound-initial, and compound-rest that simply &amp;quot;thread&amp;quot; meta-information through the computations. The inherited definition of compound-rest suffices. Now suppose we want to evaluate some expression E without counting its cost. We could use the reify and reflect operations like this:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  let r = reify(&amp;lt;runtime&amp;gt;);&lt;br /&gt;
  let result = E;&lt;br /&gt;
  reflect(&amp;lt;runtime&amp;gt;, r, result);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Here we capture the expense meta-information before evaluating E and save it as r. After evaluating E, we restore the old meta-information. The result from evaluating E is returned. Of course, any time we want to know the cumulative expense for the program, we can examine reify(&amp;lt;runtime&amp;gt;).ticks[4]. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Java and Ruby are two examples of popular programming languages that are inherently reflective, and therefore could be used to implement an ROP paradigm.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''References'''''&lt;br /&gt;
&lt;br /&gt;
[1] Reflection (Computer Science), Wikipedia: http://en.wikipedia.org/wiki/Reflection_%28computer_science%29 &amp;lt;br&amp;gt;&lt;br /&gt;
[2] Using Java Reflection, Sun: http://java.sun.com/developer/technicalArticles/ALT/Reflection/&amp;lt;br&amp;gt;&lt;br /&gt;
[3] List of reflective programming languages and platforms, Wikipedia: http://en.wikipedia.org/wiki/List_of_reflective_programming_languages_and_platforms&amp;lt;br&amp;gt;&lt;br /&gt;
[4] An Introduction to Reflection-Oriented Programming, Sobel &amp;amp; Friedman: http://www2.parc.com/csl/groups/sda/projects/reflection96/docs/sobel/sobel.pdf&amp;lt;br&amp;gt;&lt;br /&gt;
[5] What is Metainformation?: http://searchoracle.techtarget.com/sDefinition/0,,sid41_gci900705,00.html&amp;lt;br&amp;gt;&lt;br /&gt;
[6] Metaprogramming, Wikipedia: http://en.wikipedia.org/wiki/Metaprogramming&lt;/div&gt;</summary>
		<author><name>Discostu</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki2pthelm&amp;diff=25784</id>
		<title>CSC/ECE 517 Fall 2009/wiki2pthelm</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki2pthelm&amp;diff=25784"/>
		<updated>2009-10-13T18:34:38Z</updated>

		<summary type="html">&lt;p&gt;Discostu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''Reflection-Oriented Programming''' ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Reflection-Oriented Programming''' &amp;lt;b&amp;gt;(ROP)&amp;lt;/b&amp;gt;, or &amp;quot;reflective programming&amp;quot;, is defined as a programming model design with the intent to analyze and improve it's structure, performance or other implementation aspects during runtime (implying no prior knowledge of the source), as opposed to compile time. ROP is a natural extension to object-oriented programming.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Concepts'''''&lt;br /&gt;
&lt;br /&gt;
Two key concepts of ROP are meta-information, which is the state of the program at execution time, and metaprogramming, which is the idea that a language can act as it's own reflection. In other words, a language can reflect (modify) itself. More precisely, we define reflection-oriented programming to be a programming style that uses any means available (reflection or otherwise) to extend the meta-information in order to avoid situations in which a local program's requirements leads to non-local rewriting of said program [4]. Additionally, the ROP concepts extends reflection, in that it can make decisions on the architecture of the system, rather than just methods and variables.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Reflection vs. ROP'''''&lt;br /&gt;
&lt;br /&gt;
Reflection is the process by which a computer program can observe and modify it's own structure and behavior[1]. It allows an executing program to examine or &amp;quot;introspect&amp;quot; upon itself, and manipulate internal properties of the program[2]. Java, Ruby and .NET are among the most popular reflective languages, however there are many others[3]. Although reflection is the primary concept behind ROP, it does not necessarily preclude the existence of ROP. ROP is a concept of design; as with most designs, it is not necessarily dependent on the implementation. As an example, computational programming can also be used to implement the concepts of ROP, and does not assume the presence of source code at runtime, something that is essential to the concept of reflection[4].&lt;br /&gt;
&lt;br /&gt;
The ROP metaprogramming model sequences are defined as either atomic (simple) or compound (multi-atomic). These sequences take advantage of meta-information that retains knowledge of program structure, which is different than a classic object-oriented program that can lose said structure after compilation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Meta-Information'''''&lt;br /&gt;
&lt;br /&gt;
Meta-Information, or metadata, is the state of the program at execution time. Phrased another way, Meta-information is information about information. For example, a if a document is considered to be information, its title, location, and subject are examples of meta-information[5]. Meta-Information is essential not only for reflection but for the concepts of ROP to be implemented correctly. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Metaprogramming'''''&lt;br /&gt;
&lt;br /&gt;
Metaprogramming introduces the concept of &amp;quot;programs that write programs&amp;quot;. Reflection is one type of metaprogramming, and therefore can be considered as an option when attempting to design a system or program based on the concepts defined by ROP. Metaprograms are written in Metalanguage[6], which to be considered for ROP would be defined as the same or alternate language as the system or program to be implemented. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Examples'''''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;''Simple Reflection''&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As an example, first let us review what reflection looks like as an implementation. To see how reflection works, consider this simple example:&lt;br /&gt;
&lt;br /&gt;
   import java.lang.reflect.*;&lt;br /&gt;
 &lt;br /&gt;
   public class DumpMethods {&lt;br /&gt;
      public static void main(String args[])&lt;br /&gt;
      {&lt;br /&gt;
         try {&lt;br /&gt;
            Class c = Class.forName(args[0]);&lt;br /&gt;
            Method m[] = c.getDeclaredMethods();&lt;br /&gt;
            for (int i = 0; i &amp;lt; m.length; i++)&lt;br /&gt;
            System.out.println(m[i].toString());&lt;br /&gt;
         }&lt;br /&gt;
         catch (Throwable e) {&lt;br /&gt;
            System.err.println(e);&lt;br /&gt;
         }&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For an invocation of:&lt;br /&gt;
&lt;br /&gt;
  java DumpMethods java.util.Stack&lt;br /&gt;
&lt;br /&gt;
the output is:&lt;br /&gt;
&lt;br /&gt;
  public java.lang.Object java.util.Stack.push(&lt;br /&gt;
    java.lang.Object)&lt;br /&gt;
   public synchronized &lt;br /&gt;
     java.lang.Object java.util.Stack.pop()&lt;br /&gt;
   public synchronized&lt;br /&gt;
      java.lang.Object java.util.Stack.peek()&lt;br /&gt;
   public boolean java.util.Stack.empty()&lt;br /&gt;
   public synchronized &lt;br /&gt;
     int java.util.Stack.search(java.lang.Object)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
That is, the method names of class java.util.Stack are listed, along with their fully qualified parameter and return types.&lt;br /&gt;
&lt;br /&gt;
This program loads the specified class using class.forName, and then calls getDeclaredMethods to retrieve the list of methods defined in the class. java.lang.reflect.Method is a class representing a single class method. Reflection is useful because it supports dynamic retrieval of information about classes and data structures by name, and allows for their manipulation within an executing program[2].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;''ROP''&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ROP is more than just simple reflection (although technically, it can be reflection alone), it is also analyzation or improvement at runtime without prior knowledge of source. A good example of this concept is Measuring Computational Expense. To implement such behavior, we need only these definitions:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  define reflective &amp;lt;runtime&amp;gt; (&amp;lt;simple-reflective&amp;gt;)&lt;br /&gt;
  slot ticks, init-value: 0;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  define method atomic (v, outer :: &amp;lt;runtime&amp;gt;)&lt;br /&gt;
  update(outer, ticks: add1(outer.ticks))&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  define method compound-initial (outer :: &amp;lt;runtime&amp;gt;)&lt;br /&gt;
  update(outer, ticks: add1(outer.ticks))&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
It is convenient to have default behaviors for atomic, compound-initial, and compound-rest that simply &amp;quot;thread&amp;quot; meta-information through the computations. The inherited definition of compound-rest suffices. Now suppose we want to evaluate some expression E without counting its cost. We could use the reify and reflect operations like this:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  let r = reify(&amp;lt;runtime&amp;gt;);&lt;br /&gt;
  let result = E;&lt;br /&gt;
  reflect(&amp;lt;runtime&amp;gt;, r, result);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Here we capture the expense meta-information before evaluating E and save it as r. After evaluating E, we restore the old meta-information. The result from evaluating E is returned. Of course, any time we want to know the cumulative expense for the program, we can examine reify(&amp;lt;runtime&amp;gt;).ticks[4]. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Java and Ruby are two examples of popular programming languages that are inherently reflective, and therefore could be used to implement an ROP paradigm.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''References'''''&lt;br /&gt;
&lt;br /&gt;
[1] Reflection (Computer Science), Wikipedia: http://en.wikipedia.org/wiki/Reflection_%28computer_science%29 &amp;lt;br&amp;gt;&lt;br /&gt;
[2] Using Java Reflection, Sun: http://java.sun.com/developer/technicalArticles/ALT/Reflection/&amp;lt;br&amp;gt;&lt;br /&gt;
[3] List of reflective programming languages and platforms, Wikipedia: http://en.wikipedia.org/wiki/List_of_reflective_programming_languages_and_platforms&amp;lt;br&amp;gt;&lt;br /&gt;
[4] An Introduction to Reflection-Oriented Programming, Sobel &amp;amp; Friedman: http://www2.parc.com/csl/groups/sda/projects/reflection96/docs/sobel/sobel.pdf&amp;lt;br&amp;gt;&lt;br /&gt;
[5] What is Metainformation?: http://searchoracle.techtarget.com/sDefinition/0,,sid41_gci900705,00.html&amp;lt;br&amp;gt;&lt;br /&gt;
[6] Metaprogramming, Wikipedia: http://en.wikipedia.org/wiki/Metaprogramming&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;/div&gt;</summary>
		<author><name>Discostu</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki2pthelm&amp;diff=25783</id>
		<title>CSC/ECE 517 Fall 2009/wiki2pthelm</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki2pthelm&amp;diff=25783"/>
		<updated>2009-10-13T18:34:04Z</updated>

		<summary type="html">&lt;p&gt;Discostu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''Reflection-Oriented Programming''' ==&lt;br /&gt;
&lt;br /&gt;
__TOC__ Concepts&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Reflection-Oriented Programming''' &amp;lt;b&amp;gt;(ROP)&amp;lt;/b&amp;gt;, or &amp;quot;reflective programming&amp;quot;, is defined as a programming model design with the intent to analyze and improve it's structure, performance or other implementation aspects during runtime (implying no prior knowledge of the source), as opposed to compile time. ROP is a natural extension to object-oriented programming.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Concepts'''''&lt;br /&gt;
&lt;br /&gt;
Two key concepts of ROP are meta-information, which is the state of the program at execution time, and metaprogramming, which is the idea that a language can act as it's own reflection. In other words, a language can reflect (modify) itself. More precisely, we define reflection-oriented programming to be a programming style that uses any means available (reflection or otherwise) to extend the meta-information in order to avoid situations in which a local program's requirements leads to non-local rewriting of said program [4]. Additionally, the ROP concepts extends reflection, in that it can make decisions on the architecture of the system, rather than just methods and variables.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Reflection vs. ROP'''''&lt;br /&gt;
&lt;br /&gt;
Reflection is the process by which a computer program can observe and modify it's own structure and behavior[1]. It allows an executing program to examine or &amp;quot;introspect&amp;quot; upon itself, and manipulate internal properties of the program[2]. Java, Ruby and .NET are among the most popular reflective languages, however there are many others[3]. Although reflection is the primary concept behind ROP, it does not necessarily preclude the existence of ROP. ROP is a concept of design; as with most designs, it is not necessarily dependent on the implementation. As an example, computational programming can also be used to implement the concepts of ROP, and does not assume the presence of source code at runtime, something that is essential to the concept of reflection[4].&lt;br /&gt;
&lt;br /&gt;
The ROP metaprogramming model sequences are defined as either atomic (simple) or compound (multi-atomic). These sequences take advantage of meta-information that retains knowledge of program structure, which is different than a classic object-oriented program that can lose said structure after compilation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Meta-Information'''''&lt;br /&gt;
&lt;br /&gt;
Meta-Information, or metadata, is the state of the program at execution time. Phrased another way, Meta-information is information about information. For example, a if a document is considered to be information, its title, location, and subject are examples of meta-information[5]. Meta-Information is essential not only for reflection but for the concepts of ROP to be implemented correctly. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Metaprogramming'''''&lt;br /&gt;
&lt;br /&gt;
Metaprogramming introduces the concept of &amp;quot;programs that write programs&amp;quot;. Reflection is one type of metaprogramming, and therefore can be considered as an option when attempting to design a system or program based on the concepts defined by ROP. Metaprograms are written in Metalanguage[6], which to be considered for ROP would be defined as the same or alternate language as the system or program to be implemented. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Examples'''''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;''Simple Reflection''&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As an example, first let us review what reflection looks like as an implementation. To see how reflection works, consider this simple example:&lt;br /&gt;
&lt;br /&gt;
   import java.lang.reflect.*;&lt;br /&gt;
 &lt;br /&gt;
   public class DumpMethods {&lt;br /&gt;
      public static void main(String args[])&lt;br /&gt;
      {&lt;br /&gt;
         try {&lt;br /&gt;
            Class c = Class.forName(args[0]);&lt;br /&gt;
            Method m[] = c.getDeclaredMethods();&lt;br /&gt;
            for (int i = 0; i &amp;lt; m.length; i++)&lt;br /&gt;
            System.out.println(m[i].toString());&lt;br /&gt;
         }&lt;br /&gt;
         catch (Throwable e) {&lt;br /&gt;
            System.err.println(e);&lt;br /&gt;
         }&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For an invocation of:&lt;br /&gt;
&lt;br /&gt;
  java DumpMethods java.util.Stack&lt;br /&gt;
&lt;br /&gt;
the output is:&lt;br /&gt;
&lt;br /&gt;
  public java.lang.Object java.util.Stack.push(&lt;br /&gt;
    java.lang.Object)&lt;br /&gt;
   public synchronized &lt;br /&gt;
     java.lang.Object java.util.Stack.pop()&lt;br /&gt;
   public synchronized&lt;br /&gt;
      java.lang.Object java.util.Stack.peek()&lt;br /&gt;
   public boolean java.util.Stack.empty()&lt;br /&gt;
   public synchronized &lt;br /&gt;
     int java.util.Stack.search(java.lang.Object)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
That is, the method names of class java.util.Stack are listed, along with their fully qualified parameter and return types.&lt;br /&gt;
&lt;br /&gt;
This program loads the specified class using class.forName, and then calls getDeclaredMethods to retrieve the list of methods defined in the class. java.lang.reflect.Method is a class representing a single class method. Reflection is useful because it supports dynamic retrieval of information about classes and data structures by name, and allows for their manipulation within an executing program[2].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;''ROP''&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ROP is more than just simple reflection (although technically, it can be reflection alone), it is also analyzation or improvement at runtime without prior knowledge of source. A good example of this concept is Measuring Computational Expense. To implement such behavior, we need only these definitions:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  define reflective &amp;lt;runtime&amp;gt; (&amp;lt;simple-reflective&amp;gt;)&lt;br /&gt;
  slot ticks, init-value: 0;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  define method atomic (v, outer :: &amp;lt;runtime&amp;gt;)&lt;br /&gt;
  update(outer, ticks: add1(outer.ticks))&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  define method compound-initial (outer :: &amp;lt;runtime&amp;gt;)&lt;br /&gt;
  update(outer, ticks: add1(outer.ticks))&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
It is convenient to have default behaviors for atomic, compound-initial, and compound-rest that simply &amp;quot;thread&amp;quot; meta-information through the computations. The inherited definition of compound-rest suffices. Now suppose we want to evaluate some expression E without counting its cost. We could use the reify and reflect operations like this:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  let r = reify(&amp;lt;runtime&amp;gt;);&lt;br /&gt;
  let result = E;&lt;br /&gt;
  reflect(&amp;lt;runtime&amp;gt;, r, result);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Here we capture the expense meta-information before evaluating E and save it as r. After evaluating E, we restore the old meta-information. The result from evaluating E is returned. Of course, any time we want to know the cumulative expense for the program, we can examine reify(&amp;lt;runtime&amp;gt;).ticks[4]. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Java and Ruby are two examples of popular programming languages that are inherently reflective, and therefore could be used to implement an ROP paradigm.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''References'''''&lt;br /&gt;
&lt;br /&gt;
[1] Reflection (Computer Science), Wikipedia: http://en.wikipedia.org/wiki/Reflection_%28computer_science%29 &amp;lt;br&amp;gt;&lt;br /&gt;
[2] Using Java Reflection, Sun: http://java.sun.com/developer/technicalArticles/ALT/Reflection/&amp;lt;br&amp;gt;&lt;br /&gt;
[3] List of reflective programming languages and platforms, Wikipedia: http://en.wikipedia.org/wiki/List_of_reflective_programming_languages_and_platforms&amp;lt;br&amp;gt;&lt;br /&gt;
[4] An Introduction to Reflection-Oriented Programming, Sobel &amp;amp; Friedman: http://www2.parc.com/csl/groups/sda/projects/reflection96/docs/sobel/sobel.pdf&amp;lt;br&amp;gt;&lt;br /&gt;
[5] What is Metainformation?: http://searchoracle.techtarget.com/sDefinition/0,,sid41_gci900705,00.html&amp;lt;br&amp;gt;&lt;br /&gt;
[6] Metaprogramming, Wikipedia: http://en.wikipedia.org/wiki/Metaprogramming&lt;/div&gt;</summary>
		<author><name>Discostu</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki2pthelm&amp;diff=25782</id>
		<title>CSC/ECE 517 Fall 2009/wiki2pthelm</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki2pthelm&amp;diff=25782"/>
		<updated>2009-10-13T18:33:41Z</updated>

		<summary type="html">&lt;p&gt;Discostu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''Reflection-Oriented Programming''' ==&lt;br /&gt;
&lt;br /&gt;
__TOC__ &lt;br /&gt;
Concepts&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Reflection-Oriented Programming''' &amp;lt;b&amp;gt;(ROP)&amp;lt;/b&amp;gt;, or &amp;quot;reflective programming&amp;quot;, is defined as a programming model design with the intent to analyze and improve it's structure, performance or other implementation aspects during runtime (implying no prior knowledge of the source), as opposed to compile time. ROP is a natural extension to object-oriented programming.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Concepts'''''&lt;br /&gt;
&lt;br /&gt;
Two key concepts of ROP are meta-information, which is the state of the program at execution time, and metaprogramming, which is the idea that a language can act as it's own reflection. In other words, a language can reflect (modify) itself. More precisely, we define reflection-oriented programming to be a programming style that uses any means available (reflection or otherwise) to extend the meta-information in order to avoid situations in which a local program's requirements leads to non-local rewriting of said program [4]. Additionally, the ROP concepts extends reflection, in that it can make decisions on the architecture of the system, rather than just methods and variables.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Reflection vs. ROP'''''&lt;br /&gt;
&lt;br /&gt;
Reflection is the process by which a computer program can observe and modify it's own structure and behavior[1]. It allows an executing program to examine or &amp;quot;introspect&amp;quot; upon itself, and manipulate internal properties of the program[2]. Java, Ruby and .NET are among the most popular reflective languages, however there are many others[3]. Although reflection is the primary concept behind ROP, it does not necessarily preclude the existence of ROP. ROP is a concept of design; as with most designs, it is not necessarily dependent on the implementation. As an example, computational programming can also be used to implement the concepts of ROP, and does not assume the presence of source code at runtime, something that is essential to the concept of reflection[4].&lt;br /&gt;
&lt;br /&gt;
The ROP metaprogramming model sequences are defined as either atomic (simple) or compound (multi-atomic). These sequences take advantage of meta-information that retains knowledge of program structure, which is different than a classic object-oriented program that can lose said structure after compilation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Meta-Information'''''&lt;br /&gt;
&lt;br /&gt;
Meta-Information, or metadata, is the state of the program at execution time. Phrased another way, Meta-information is information about information. For example, a if a document is considered to be information, its title, location, and subject are examples of meta-information[5]. Meta-Information is essential not only for reflection but for the concepts of ROP to be implemented correctly. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Metaprogramming'''''&lt;br /&gt;
&lt;br /&gt;
Metaprogramming introduces the concept of &amp;quot;programs that write programs&amp;quot;. Reflection is one type of metaprogramming, and therefore can be considered as an option when attempting to design a system or program based on the concepts defined by ROP. Metaprograms are written in Metalanguage[6], which to be considered for ROP would be defined as the same or alternate language as the system or program to be implemented. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Examples'''''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;''Simple Reflection''&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As an example, first let us review what reflection looks like as an implementation. To see how reflection works, consider this simple example:&lt;br /&gt;
&lt;br /&gt;
   import java.lang.reflect.*;&lt;br /&gt;
 &lt;br /&gt;
   public class DumpMethods {&lt;br /&gt;
      public static void main(String args[])&lt;br /&gt;
      {&lt;br /&gt;
         try {&lt;br /&gt;
            Class c = Class.forName(args[0]);&lt;br /&gt;
            Method m[] = c.getDeclaredMethods();&lt;br /&gt;
            for (int i = 0; i &amp;lt; m.length; i++)&lt;br /&gt;
            System.out.println(m[i].toString());&lt;br /&gt;
         }&lt;br /&gt;
         catch (Throwable e) {&lt;br /&gt;
            System.err.println(e);&lt;br /&gt;
         }&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For an invocation of:&lt;br /&gt;
&lt;br /&gt;
  java DumpMethods java.util.Stack&lt;br /&gt;
&lt;br /&gt;
the output is:&lt;br /&gt;
&lt;br /&gt;
  public java.lang.Object java.util.Stack.push(&lt;br /&gt;
    java.lang.Object)&lt;br /&gt;
   public synchronized &lt;br /&gt;
     java.lang.Object java.util.Stack.pop()&lt;br /&gt;
   public synchronized&lt;br /&gt;
      java.lang.Object java.util.Stack.peek()&lt;br /&gt;
   public boolean java.util.Stack.empty()&lt;br /&gt;
   public synchronized &lt;br /&gt;
     int java.util.Stack.search(java.lang.Object)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
That is, the method names of class java.util.Stack are listed, along with their fully qualified parameter and return types.&lt;br /&gt;
&lt;br /&gt;
This program loads the specified class using class.forName, and then calls getDeclaredMethods to retrieve the list of methods defined in the class. java.lang.reflect.Method is a class representing a single class method. Reflection is useful because it supports dynamic retrieval of information about classes and data structures by name, and allows for their manipulation within an executing program[2].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;''ROP''&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ROP is more than just simple reflection (although technically, it can be reflection alone), it is also analyzation or improvement at runtime without prior knowledge of source. A good example of this concept is Measuring Computational Expense. To implement such behavior, we need only these definitions:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  define reflective &amp;lt;runtime&amp;gt; (&amp;lt;simple-reflective&amp;gt;)&lt;br /&gt;
  slot ticks, init-value: 0;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  define method atomic (v, outer :: &amp;lt;runtime&amp;gt;)&lt;br /&gt;
  update(outer, ticks: add1(outer.ticks))&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  define method compound-initial (outer :: &amp;lt;runtime&amp;gt;)&lt;br /&gt;
  update(outer, ticks: add1(outer.ticks))&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
It is convenient to have default behaviors for atomic, compound-initial, and compound-rest that simply &amp;quot;thread&amp;quot; meta-information through the computations. The inherited definition of compound-rest suffices. Now suppose we want to evaluate some expression E without counting its cost. We could use the reify and reflect operations like this:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  let r = reify(&amp;lt;runtime&amp;gt;);&lt;br /&gt;
  let result = E;&lt;br /&gt;
  reflect(&amp;lt;runtime&amp;gt;, r, result);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Here we capture the expense meta-information before evaluating E and save it as r. After evaluating E, we restore the old meta-information. The result from evaluating E is returned. Of course, any time we want to know the cumulative expense for the program, we can examine reify(&amp;lt;runtime&amp;gt;).ticks[4]. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Java and Ruby are two examples of popular programming languages that are inherently reflective, and therefore could be used to implement an ROP paradigm.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''References'''''&lt;br /&gt;
&lt;br /&gt;
[1] Reflection (Computer Science), Wikipedia: http://en.wikipedia.org/wiki/Reflection_%28computer_science%29 &amp;lt;br&amp;gt;&lt;br /&gt;
[2] Using Java Reflection, Sun: http://java.sun.com/developer/technicalArticles/ALT/Reflection/&amp;lt;br&amp;gt;&lt;br /&gt;
[3] List of reflective programming languages and platforms, Wikipedia: http://en.wikipedia.org/wiki/List_of_reflective_programming_languages_and_platforms&amp;lt;br&amp;gt;&lt;br /&gt;
[4] An Introduction to Reflection-Oriented Programming, Sobel &amp;amp; Friedman: http://www2.parc.com/csl/groups/sda/projects/reflection96/docs/sobel/sobel.pdf&amp;lt;br&amp;gt;&lt;br /&gt;
[5] What is Metainformation?: http://searchoracle.techtarget.com/sDefinition/0,,sid41_gci900705,00.html&amp;lt;br&amp;gt;&lt;br /&gt;
[6] Metaprogramming, Wikipedia: http://en.wikipedia.org/wiki/Metaprogramming&lt;/div&gt;</summary>
		<author><name>Discostu</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki2pthelm&amp;diff=25781</id>
		<title>CSC/ECE 517 Fall 2009/wiki2pthelm</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki2pthelm&amp;diff=25781"/>
		<updated>2009-10-13T18:33:13Z</updated>

		<summary type="html">&lt;p&gt;Discostu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''Reflection-Oriented Programming''' ==&lt;br /&gt;
&lt;br /&gt;
__TOC__ &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Reflection-Oriented Programming''' &amp;lt;b&amp;gt;(ROP)&amp;lt;/b&amp;gt;, or &amp;quot;reflective programming&amp;quot;, is defined as a programming model design with the intent to analyze and improve it's structure, performance or other implementation aspects during runtime (implying no prior knowledge of the source), as opposed to compile time. ROP is a natural extension to object-oriented programming.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Concepts'''''&lt;br /&gt;
&lt;br /&gt;
Two key concepts of ROP are meta-information, which is the state of the program at execution time, and metaprogramming, which is the idea that a language can act as it's own reflection. In other words, a language can reflect (modify) itself. More precisely, we define reflection-oriented programming to be a programming style that uses any means available (reflection or otherwise) to extend the meta-information in order to avoid situations in which a local program's requirements leads to non-local rewriting of said program [4]. Additionally, the ROP concepts extends reflection, in that it can make decisions on the architecture of the system, rather than just methods and variables.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Reflection vs. ROP'''''&lt;br /&gt;
&lt;br /&gt;
Reflection is the process by which a computer program can observe and modify it's own structure and behavior[1]. It allows an executing program to examine or &amp;quot;introspect&amp;quot; upon itself, and manipulate internal properties of the program[2]. Java, Ruby and .NET are among the most popular reflective languages, however there are many others[3]. Although reflection is the primary concept behind ROP, it does not necessarily preclude the existence of ROP. ROP is a concept of design; as with most designs, it is not necessarily dependent on the implementation. As an example, computational programming can also be used to implement the concepts of ROP, and does not assume the presence of source code at runtime, something that is essential to the concept of reflection[4].&lt;br /&gt;
&lt;br /&gt;
The ROP metaprogramming model sequences are defined as either atomic (simple) or compound (multi-atomic). These sequences take advantage of meta-information that retains knowledge of program structure, which is different than a classic object-oriented program that can lose said structure after compilation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Meta-Information'''''&lt;br /&gt;
&lt;br /&gt;
Meta-Information, or metadata, is the state of the program at execution time. Phrased another way, Meta-information is information about information. For example, a if a document is considered to be information, its title, location, and subject are examples of meta-information[5]. Meta-Information is essential not only for reflection but for the concepts of ROP to be implemented correctly. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Metaprogramming'''''&lt;br /&gt;
&lt;br /&gt;
Metaprogramming introduces the concept of &amp;quot;programs that write programs&amp;quot;. Reflection is one type of metaprogramming, and therefore can be considered as an option when attempting to design a system or program based on the concepts defined by ROP. Metaprograms are written in Metalanguage[6], which to be considered for ROP would be defined as the same or alternate language as the system or program to be implemented. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Examples'''''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;''Simple Reflection''&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As an example, first let us review what reflection looks like as an implementation. To see how reflection works, consider this simple example:&lt;br /&gt;
&lt;br /&gt;
   import java.lang.reflect.*;&lt;br /&gt;
 &lt;br /&gt;
   public class DumpMethods {&lt;br /&gt;
      public static void main(String args[])&lt;br /&gt;
      {&lt;br /&gt;
         try {&lt;br /&gt;
            Class c = Class.forName(args[0]);&lt;br /&gt;
            Method m[] = c.getDeclaredMethods();&lt;br /&gt;
            for (int i = 0; i &amp;lt; m.length; i++)&lt;br /&gt;
            System.out.println(m[i].toString());&lt;br /&gt;
         }&lt;br /&gt;
         catch (Throwable e) {&lt;br /&gt;
            System.err.println(e);&lt;br /&gt;
         }&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For an invocation of:&lt;br /&gt;
&lt;br /&gt;
  java DumpMethods java.util.Stack&lt;br /&gt;
&lt;br /&gt;
the output is:&lt;br /&gt;
&lt;br /&gt;
  public java.lang.Object java.util.Stack.push(&lt;br /&gt;
    java.lang.Object)&lt;br /&gt;
   public synchronized &lt;br /&gt;
     java.lang.Object java.util.Stack.pop()&lt;br /&gt;
   public synchronized&lt;br /&gt;
      java.lang.Object java.util.Stack.peek()&lt;br /&gt;
   public boolean java.util.Stack.empty()&lt;br /&gt;
   public synchronized &lt;br /&gt;
     int java.util.Stack.search(java.lang.Object)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
That is, the method names of class java.util.Stack are listed, along with their fully qualified parameter and return types.&lt;br /&gt;
&lt;br /&gt;
This program loads the specified class using class.forName, and then calls getDeclaredMethods to retrieve the list of methods defined in the class. java.lang.reflect.Method is a class representing a single class method. Reflection is useful because it supports dynamic retrieval of information about classes and data structures by name, and allows for their manipulation within an executing program[2].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;''ROP''&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ROP is more than just simple reflection (although technically, it can be reflection alone), it is also analyzation or improvement at runtime without prior knowledge of source. A good example of this concept is Measuring Computational Expense. To implement such behavior, we need only these definitions:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  define reflective &amp;lt;runtime&amp;gt; (&amp;lt;simple-reflective&amp;gt;)&lt;br /&gt;
  slot ticks, init-value: 0;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  define method atomic (v, outer :: &amp;lt;runtime&amp;gt;)&lt;br /&gt;
  update(outer, ticks: add1(outer.ticks))&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  define method compound-initial (outer :: &amp;lt;runtime&amp;gt;)&lt;br /&gt;
  update(outer, ticks: add1(outer.ticks))&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
It is convenient to have default behaviors for atomic, compound-initial, and compound-rest that simply &amp;quot;thread&amp;quot; meta-information through the computations. The inherited definition of compound-rest suffices. Now suppose we want to evaluate some expression E without counting its cost. We could use the reify and reflect operations like this:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  let r = reify(&amp;lt;runtime&amp;gt;);&lt;br /&gt;
  let result = E;&lt;br /&gt;
  reflect(&amp;lt;runtime&amp;gt;, r, result);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Here we capture the expense meta-information before evaluating E and save it as r. After evaluating E, we restore the old meta-information. The result from evaluating E is returned. Of course, any time we want to know the cumulative expense for the program, we can examine reify(&amp;lt;runtime&amp;gt;).ticks[4]. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Java and Ruby are two examples of popular programming languages that are inherently reflective, and therefore could be used to implement an ROP paradigm.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''References'''''&lt;br /&gt;
&lt;br /&gt;
[1] Reflection (Computer Science), Wikipedia: http://en.wikipedia.org/wiki/Reflection_%28computer_science%29 &amp;lt;br&amp;gt;&lt;br /&gt;
[2] Using Java Reflection, Sun: http://java.sun.com/developer/technicalArticles/ALT/Reflection/&amp;lt;br&amp;gt;&lt;br /&gt;
[3] List of reflective programming languages and platforms, Wikipedia: http://en.wikipedia.org/wiki/List_of_reflective_programming_languages_and_platforms&amp;lt;br&amp;gt;&lt;br /&gt;
[4] An Introduction to Reflection-Oriented Programming, Sobel &amp;amp; Friedman: http://www2.parc.com/csl/groups/sda/projects/reflection96/docs/sobel/sobel.pdf&amp;lt;br&amp;gt;&lt;br /&gt;
[5] What is Metainformation?: http://searchoracle.techtarget.com/sDefinition/0,,sid41_gci900705,00.html&amp;lt;br&amp;gt;&lt;br /&gt;
[6] Metaprogramming, Wikipedia: http://en.wikipedia.org/wiki/Metaprogramming&lt;/div&gt;</summary>
		<author><name>Discostu</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki2pthelm&amp;diff=24413</id>
		<title>CSC/ECE 517 Fall 2009/wiki2pthelm</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2009/wiki2pthelm&amp;diff=24413"/>
		<updated>2009-10-09T20:39:03Z</updated>

		<summary type="html">&lt;p&gt;Discostu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''Reflection-Oriented Programming''' ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Reflection-Oriented Programming''' &amp;lt;b&amp;gt;(ROP)&amp;lt;/b&amp;gt;, or &amp;quot;reflective programming&amp;quot;, is defined as a programming model design with the intent to analyze and improve it's structure, performance or other implementation aspects during runtime (implying no prior knowledge of the source), as opposed to compile time. ROP is a natural extension to object-oriented programming.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Concepts'''''&lt;br /&gt;
&lt;br /&gt;
Two key concepts of ROP are meta-information, which is the state of the program at execution time, and metaprogramming, which is the idea that a language can act as it's own reflection. In other words, a language can reflect (modify) itself. More precisely, we define reflection-oriented programming to be a programming style that uses any means available (reflection or otherwise) to extend the meta-information in order to avoid situations in which a local program's requirements leads to non-local rewriting of said program [4]. Additionally, the ROP concepts extends reflection, in that it can make decisions on the architecture of the system, rather than just methods and variables.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Reflection vs. ROP'''''&lt;br /&gt;
&lt;br /&gt;
Reflection is the process by which a computer program can observe and modify it's own structure and behavior[1]. It allows an executing program to examine or &amp;quot;introspect&amp;quot; upon itself, and manipulate internal properties of the program[2]. Java, Ruby and .NET are among the most popular reflective languages, however there are many others[3]. Although reflection is the primary concept behind ROP, it does not necessarily preclude the existence of ROP. ROP is a concept of design; as with most designs, it is not necessarily dependent on the implementation. As an example, computational programming can also be used to implement the concepts of ROP, and does not assume the presence of source code at runtime, something that is essential to the concept of reflection[4].&lt;br /&gt;
&lt;br /&gt;
The ROP metaprogramming model sequences are defined as either atomic (simple) or compound (multi-atomic). These sequences take advantage of meta-information that retains knowledge of program structure, which is different than a classic object-oriented program that can lose said structure after compilation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Meta-Information'''''&lt;br /&gt;
&lt;br /&gt;
Meta-Information, or metadata, is the state of the program at execution time. Phrased another way, Meta-information is information about information. For example, a if a document is considered to be information, its title, location, and subject are examples of meta-information[5]. Meta-Information is essential not only for reflection but for the concepts of ROP to be implemented correctly. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Metaprogramming'''''&lt;br /&gt;
&lt;br /&gt;
Metaprogramming introduces the concept of &amp;quot;programs that write programs&amp;quot;. Reflection is one type of metaprogramming, and therefore can be considered as an option when attempting to design a system or program based on the concepts defined by ROP. Metaprograms are written in Metalanguage[6], which to be considered for ROP would be defined as the same or alternate language as the system or program to be implemented. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Examples'''''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;''Simple Reflection''&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As an example, first let us review what reflection looks like as an implementation. To see how reflection works, consider this simple example:&lt;br /&gt;
&lt;br /&gt;
   import java.lang.reflect.*;&lt;br /&gt;
 &lt;br /&gt;
   public class DumpMethods {&lt;br /&gt;
      public static void main(String args[])&lt;br /&gt;
      {&lt;br /&gt;
         try {&lt;br /&gt;
            Class c = Class.forName(args[0]);&lt;br /&gt;
            Method m[] = c.getDeclaredMethods();&lt;br /&gt;
            for (int i = 0; i &amp;lt; m.length; i++)&lt;br /&gt;
            System.out.println(m[i].toString());&lt;br /&gt;
         }&lt;br /&gt;
         catch (Throwable e) {&lt;br /&gt;
            System.err.println(e);&lt;br /&gt;
         }&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For an invocation of:&lt;br /&gt;
&lt;br /&gt;
  java DumpMethods java.util.Stack&lt;br /&gt;
&lt;br /&gt;
the output is:&lt;br /&gt;
&lt;br /&gt;
  public java.lang.Object java.util.Stack.push(&lt;br /&gt;
    java.lang.Object)&lt;br /&gt;
   public synchronized &lt;br /&gt;
     java.lang.Object java.util.Stack.pop()&lt;br /&gt;
   public synchronized&lt;br /&gt;
      java.lang.Object java.util.Stack.peek()&lt;br /&gt;
   public boolean java.util.Stack.empty()&lt;br /&gt;
   public synchronized &lt;br /&gt;
     int java.util.Stack.search(java.lang.Object)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
That is, the method names of class java.util.Stack are listed, along with their fully qualified parameter and return types.&lt;br /&gt;
&lt;br /&gt;
This program loads the specified class using class.forName, and then calls getDeclaredMethods to retrieve the list of methods defined in the class. java.lang.reflect.Method is a class representing a single class method. Reflection is useful because it supports dynamic retrieval of information about classes and data structures by name, and allows for their manipulation within an executing program[2].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;''ROP''&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ROP is more than just simple reflection (although technically, it can be reflection alone), it is also analyzation or improvement at runtime without prior knowledge of source. A good example of this concept is Measuring Computational Expense. To implement such behavior, we need only these definitions:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  define reflective &amp;lt;runtime&amp;gt; (&amp;lt;simple-reflective&amp;gt;)&lt;br /&gt;
  slot ticks, init-value: 0;&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  define method atomic (v, outer :: &amp;lt;runtime&amp;gt;)&lt;br /&gt;
  update(outer, ticks: add1(outer.ticks))&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
  define method compound-initial (outer :: &amp;lt;runtime&amp;gt;)&lt;br /&gt;
  update(outer, ticks: add1(outer.ticks))&lt;br /&gt;
  end;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
It is convenient to have default behaviors for atomic, compound-initial, and compound-rest that simply &amp;quot;thread&amp;quot; meta-information through the computations. The inherited definition of compound-rest suffices. Now suppose we want to evaluate some expression E without counting its cost. We could use the reify and reflect operations like this:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  let r = reify(&amp;lt;runtime&amp;gt;);&lt;br /&gt;
  let result = E;&lt;br /&gt;
  reflect(&amp;lt;runtime&amp;gt;, r, result);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Here we capture the expense meta-information before evaluating E and save it as r. After evaluating E, we restore the old meta-information. The result from evaluating E is returned. Of course, any time we want to know the cumulative expense for the program, we can examine reify(&amp;lt;runtime&amp;gt;).ticks[4]. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Java and Ruby are two examples of popular programming languages that are inherently reflective, and therefore could be used to implement an ROP paradigm.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''References'''''&lt;br /&gt;
&lt;br /&gt;
[1] Reflection (Computer Science), Wikipedia: http://en.wikipedia.org/wiki/Reflection_%28computer_science%29 &amp;lt;br&amp;gt;&lt;br /&gt;
[2] Using Java Reflection, Sun: http://java.sun.com/developer/technicalArticles/ALT/Reflection/&amp;lt;br&amp;gt;&lt;br /&gt;
[3] List of reflective programming languages and platforms, Wikipedia: http://en.wikipedia.org/wiki/List_of_reflective_programming_languages_and_platforms&amp;lt;br&amp;gt;&lt;br /&gt;
[4] An Introduction to Reflection-Oriented Programming, Sobel &amp;amp; Friedman: http://www2.parc.com/csl/groups/sda/projects/reflection96/docs/sobel/sobel.pdf&amp;lt;br&amp;gt;&lt;br /&gt;
[5] What is Metainformation?: http://searchoracle.techtarget.com/sDefinition/0,,sid41_gci900705,00.html&amp;lt;br&amp;gt;&lt;br /&gt;
[6] Metaprogramming, Wikipedia: http://en.wikipedia.org/wiki/Metaprogramming&lt;/div&gt;</summary>
		<author><name>Discostu</name></author>
	</entry>
</feed>