<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://mediawiki.zeropage.org/index.php?action=history&amp;feed=atom&amp;title=PluggableSelector</id>
	<title>PluggableSelector - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://mediawiki.zeropage.org/index.php?action=history&amp;feed=atom&amp;title=PluggableSelector"/>
	<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=PluggableSelector&amp;action=history"/>
	<updated>2026-05-14T18:28:06Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.8</generator>
	<entry>
		<id>https://mediawiki.zeropage.org/index.php?title=PluggableSelector&amp;diff=37493&amp;oldid=prev</id>
		<title>imported&gt;Unknown at 05:24, 7 February 2021</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=PluggableSelector&amp;diff=37493&amp;oldid=prev"/>
		<updated>2021-02-07T05:24:00Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Pluggable Selector ==&lt;br /&gt;
가장 간단하게 Pluggable Behavior를 구현하는 방법은 실행될 행동을 저장해놓는 것이다. 먼저 이것의 반례, 즉 서브클래싱 한것을 보자.&lt;br /&gt;
 class ListPane&lt;br /&gt;
 {&lt;br /&gt;
 public:&lt;br /&gt;
 	Type printElement(Object&amp;amp;amp; anObject) {&lt;br /&gt;
 		return anObject.printString();&lt;br /&gt;
 	}&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 class DollarListPane : public ListPane&lt;br /&gt;
 {&lt;br /&gt;
 public:&lt;br /&gt;
 	Type printElement(Object&amp;amp;amp; anObject) {&lt;br /&gt;
 		return anObject.asDollarFormatString();&lt;br /&gt;
 	}&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 class DiscriptionListPane : public ListPane&lt;br /&gt;
 {&lt;br /&gt;
 public:&lt;br /&gt;
 	Type printElement(Object&amp;amp;amp; anObject) {&lt;br /&gt;
 		return anObject.desription();&lt;br /&gt;
 	}&lt;br /&gt;
 };&lt;br /&gt;
----&lt;br /&gt;
이런식으로 하나의 메소드만 계속 오버라이딩한다면 서브클래스들의 가치가 없을것 같다. 쉬운 해결책은 ListPane 스스로를 좀 더 유연하게 만드는 것이다. 다른 인스턴스들이 다른 메세지를 보내게 하는 것이다.&lt;br /&gt;
 class ListPane&lt;br /&gt;
 {&lt;br /&gt;
 private:&lt;br /&gt;
 	void (ListPane::*printMessage)();&lt;br /&gt;
 public:&lt;br /&gt;
 	Type printElement(Object&amp;amp;amp; anObject) {&lt;br /&gt;
 		return anObject.perform(printMessage);&lt;br /&gt;
 	}&lt;br /&gt;
 	void initialize() {&lt;br /&gt;
 		printMessage = printString;	// printString은 어딘가에 구현되어 있다.&lt;br /&gt;
 	}&lt;br /&gt;
 };&lt;br /&gt;
가독성 : 그냥 서브클래싱한것보다 떨어진다.&lt;br /&gt;
유연성 : P.S는 수신 객체에 구현되어야 한다. &lt;br /&gt;
확장성 : 한 오브젝트마다 최대 두번까지만 쓰자. 더 많이 쓰면 프로그램의 의도가 흐려진다. 더 많이 쓰고 싶으면 State Object를 쓰는 법이 있다.&lt;br /&gt;
----&lt;br /&gt;
실행될 selector를 가지는 변수를 추가한다. 이름 뒤에 Message를 덧붙인다. selector를 실행하기 쉽게 해주는 Composed Method를 만든다.&lt;br /&gt;
----&lt;br /&gt;
예를 들어, 어떤 비쥬얼한 컴포넌트를 다른 것의 상대적인 부분에 위치시키고 싶다면, 상대적인 위치를 만들어주는 Pluggable Selector를 사용할 수 있다.(???)&lt;br /&gt;
 class RelativePoint&lt;br /&gt;
 {&lt;br /&gt;
 public:&lt;br /&gt;
 	static RelativePoint* centered(Figure&amp;amp;amp; aFigure) {&lt;br /&gt;
 		RelativePonit* rp = new RelativePoint;&lt;br /&gt;
 		rp-&amp;amp;gt;setFigurenMessage(aFigure, center);		&lt;br /&gt;
 	}&lt;br /&gt;
 	void setFigurenMessage(Figure&amp;amp;amp; aFigure, int aSymbol()) {&lt;br /&gt;
 		figure = aFigure;&lt;br /&gt;
 		locationMessage = aSymbol;&lt;br /&gt;
 	}&lt;br /&gt;
 };&lt;br /&gt;
이제 일반 Point처럼 사용할 수 있다.&lt;br /&gt;
 Point RelativePoint::asPoint()&lt;br /&gt;
 {&lt;br /&gt;
 	return figure.perform(locationMessage);&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 Point RelativePoint::x()&lt;br /&gt;
 {&lt;br /&gt;
 	return asPoint().x();&lt;br /&gt;
 }&lt;br /&gt;
이런 식으로 하면 CenteredRelativePoint, TopLeftRelativePoint같은 서브클래스를 만들 필요가 없다. 위에서 center라는 메세지를 추가한 것처럼, topLeft메세지를 추가만 하면 되는 것이다.&lt;br /&gt;
----&lt;br /&gt;
[[SBPPSummary]]&lt;br /&gt;
&lt;/div&gt;</summary>
		<author><name>imported&gt;Unknown</name></author>
	</entry>
</feed>