Extract Interface Refactoring  

 

ÀÌ ¼½¼ÇÀº Extract Interface ¸®ÆÑÅ丵 À§¿¡¼­ ´ç½Å¿¡°Ô Æ÷°ýÀûÀΠoverview¿Í how ÀÌ ¸®ÆÑÅ丵ÀÌ IntelliJ IDEA¿¡¼­ »ç¿ëµÉ ¼ö Àִ°¡¸¦ Á¦°øÇÕ´Ï´Ù.

°³¿ä


Extract Interface ¸®ÆÑÅ丵°ú ´õºÒ¾î ´ç½ÅÀº µÎ ¿É¼ÇÀ» °¡Áý´Ï´Ù.  Ã¹ ¹øÂ°(Extract Interface) ´Â Ŭ·¡½ºÀÇ ¸Þ¼Òµå¸¦ ±âÃÊ·Î ÇÏ´Â ÀÎÅÍÆäÀ̽º¸¦ »ý¼ºÇϵµ·Ï Çã¶ôÇÕ´Ï´Ù.

 

µÎ ¹øÂ° (Rename original class and use interface where possible) ´Â ¿ø·¡ÀÇ Å¬·¡½ºÀÇ À̸§À» º¯°æÇÏ°í »õ·Ó°Ô »ý¼ºµÈ ÀÎÅÍÆäÀ̽º¸¦ ±¸ÇöÇÕ´Ï´Ù. ±×·± °æ¿ì, °¡´ÉÇϸé IDEA´Â ±×¶§ ÀÎÅÍÆäÀ̽º¸¦ »ç¿ëÇϱâ À§ÇØ ¸ðµç ¿ø·¡ÀÇ Å¬·¡½º »ç¿ëÀ» ¹Ù²ß´Ï´Ù (±×¸®°í ±×°ÍÀÌ ÀÖÁö ¾ÊÀº °÷¿¡¼­ ±×°ÍµéÀ» º¯°æÇÏÁö ¾ÊÀ» °ÍÀÔ´Ï´Ù).

 

¶ÇÇÑ, ÃÖÃÊÀÇ Å¬·¡½º¿¡¼­ ¼±¾ðµÈ Á¤ÀûÀÎ ÃÖÁ¾ÀûÀÎ Çʵå´Â ÀÎÅÍÆäÀ̽º·Î À̵¿µÉ ¼ö ÀÖ½À´Ï´Ù.  ±× °á°ú, ÀÎÅÍÆäÀ̽º´Â ƯÁ¤ÀÇ ¸Þ¼Òµå¿Í Çʵ带 Æ÷ÇÔÇϸ鼭 »ý¼ºµÉ °ÍÀÔ´Ï´Ù.  ±× ¶§¹®¿¡, Á¤ÀÇµÈ Å¬·¡½º ¸Þ¼Òµå´Â »óÀÀÇÏ´Â ÀÎÅÍÆäÀ̽º ¸Þ¼ÒµåÀÇ ±¸ÇöÀÌ µË´Ï´Ù.

 

Extract Interface ¿É¼ÇÀ» À§ÇÑ ¿¹Á¦ ÄÚµå

¿ì¸®´Â ´ÙÀ½ÀÇ Å¬·¡½º¸¦ °¡Áý´Ï´Ù:

 
class AClass {
    public static final double CONSTANT=3.14;
    public void publicMethod() {//some code here}
    public void secretMethod() {//some code here}
}

¸®ÆÑÅ丵 ÀÌÈÄ, »õ·Î¿î ÀÎÅÍÆäÀ̽º´Â »ý¼ºµÉ °ÍÀÔ´Ï´Ù:

public interface AnInterface {
    double CONSTANT=3.14;
    void publicMethod();
}


¼Ò½º Ŭ·¡½º´Â ÀÎÅÍÆäÀ̽º¸¦ ½ÇÇàÇÒ °ÍÀÔ´Ï´Ù:

 
class AClass implements AnInterface {
    public void publicMethod() {//some code here}
    public void secretMethod() {//some code here}
}
     

¸¸ÀÏ Rename original class and use interface where possible  ¿É¼ÇÀÌ ¼±ÅõǸé Äڵ带 ¿¹½ÃÇϽʽÿÀ:

public class FormerAClass implements AClass {
    public void publicMethod() {//some code here }
    public void secretMethod() {//some code here}
}
 
±×¸®°í ÀÌÀüÀÇ Å¬·¡½ºÀÇ À̸§À» °¡Áö´Â »õ·Ó°Ô »ý¼ºµÈ ÀÎÅÍÆäÀ̽º:  
 
public interface AClass {
    double CONSTANT=3.14;
 
    void publicMethod();
}
 

´ç½ÅÀº ¶Ç ´Ù¸¥ ÀÎÅÍÆäÀ̽º¸¦ ÀÌ¹Ì ½ÇÇàÇϴ Ŭ·¡½º·ÎºÎÅÍ ÀÎÅÍÆäÀ̽º¸¦ ÃßÃâÇÒ ¼ö ÀÖ½À´Ï´Ù. AnInterface¸¦ ¼öÇàÇϴ Ŭ·¡½º·ÎºÎÅÍ extract interface¸¦ ÇÕ´Ï´Ù. ¿ì¸®´Â AnotherInterface(ÃßÃâµÈ ¸Þ¼Òµå)°¡ AnInterface (±âÁ¸ÀÇ °Í)·Î È®ÀåµÇ±â¸¦ ¿øÇÏ´ÂÁö ¶Ç´Â ±×µéÀ» ÀÌÇàÇÒ ¼Ò½º AClassÀ» ¿ì¸®°¡ ¿øÇÏ´ÂÁö¿¡ µû¶ó¼­ ¿ì¸®´Â ´ÙÀ½ÀÇ Äڵ带 ¾ò°Ô µÉ °ÍÀÔ´Ï´Ù.


Extracted Interface extends the existing one Source class:

 
class AClass implements AnotherInterface {
    public void publicMethod() { //some code here }
    public void secretMethod() { //some code here }
}
 

Extracted Interface: 

 
public interface AnotherInterface extends AnInterface {
}
 

Source class implements both interfaces  

Source class: 

 
 class AClass implements AnInterface, AnotherInterface {
    public void publicMethod() { //some code here }
    public void secretMethod() { //some code here }
}

Extracted Interface: 

public interface AnotherInterface {
}

ÀÎÅÍÆäÀ̽º°¡ ÃßÃâµÇ¾ú´õ¶ó¸é, IDEA´Â Ŭ·¡½ºÀÇ »ç¿ëÀ» °Ë»öÇϰí, ÀÎÅÍÆäÀ̽ºÀÇ »ç¿ëÀ¸·Î ±×µéÀ» °¡´ÉÇÏ¸é ±³Ã¼ÇÒ °ÍÀ» Á¦¾ÈÇÒ °ÍÀÔ´Ï´Ù.  ´ç½ÅÀº IDEA°¡ ÀÌ µ¿ÀÛÀ» ÀÚµ¿ÀûÀ¸·Î ¼öÇàÇÏ°Ô ÇÒ ¼ö Àְųª, »ç¿ëÀÌ ¹ß°ßµÇ°í, ±×µéÀÇ ±³Ã¼¸¦ ½ÂÀÎÇÏ´Â °ÍÀÇ Á¤º¸¸¦ °è¼Ó ¾òÀ» ¼ö ÀÖ½À´Ï´Ù.

¿¹Á¦ ÄÚµå:

class AClass implements AnInterface {
    public void publicMethod() {//some code here}
    public void secretMethod() {//some code here}
 
}
    ...
    ...
 
//This usage can be modified by changing the
//parameter type from 'AClass' to 'AnInterface'
 
 void foo (AClass aClass){
    aClass.publicMethod();
}
 
...

  
...

  
 
//This usage will not be suggested for 
//refactoring because it is not specified in the interface
 
void bar (AClass aClass){
    aClass.secretMethod();
}
 

ÀÎÅÍÆäÀ̽º ÃßÃâ


Ŭ·¡½º·ÎºÎÅÍ ÀÎÅÍÆäÀ̽º¸¦ ÃßÃâÇϱâ À§ÇØ ´ÙÀ½À» ÇÕ´Ï´Ù:

 1.   Project º¸±â¿¡¼­ Ŭ·¡½º¸¦ ¼±ÅÃÇϰųª ¹®¼­ ÆíÁý±â¿¡¼­ Ŭ·¡½º ³»¿¡¼­ ij·µÀ» ¾î´À °÷¿¡ ¹èÄ¡ÇϽʽÿÀ, ±×¸®°í Extract Interface ¸¦ ÆË¾÷ ¸Þ´º·ÎºÎÅÍ ¶Ç´Â Refactor ¸Þ´º·ÎºÎÅÍ °í¸£½Ê½Ã¿À.


´ç½ÅÀº ¶ÇÇÑ Å¬·¡½º¸¦ Structure, Commander, Source µî°ú °°Àº ´Ù¸¥ º¸±â¿¡¼­ °í¸¦ ¼ö ÀÖ½À´Ï´Ù.



 2.   ±× ÈÄ¿¡, ´ÙÀ½ À©µµ¿ì´Â ¸®ÆÑÅ丵 ¸Å°³ º¯¼ö¸¦ ÁöÁ¤Çϱâ À§ÇØ ³ªÅ¸³¯ °ÍÀÔ´Ï´Ù:



ù ¹øÂ°·Î, µÎ ¿É¼Ç(Extract Interface  ¶Ç´Â Rename original class and use interface where possible ) ¹öư ÁßÀÇ ÇÑ °³¸¦ ¼±ÅÃÇϽʽÿÀ. ±×¸®°í ³ª¼­ Interface name  ¶Ç´Â Rename original class to ÅؽºÆ® Çʵ忡¼­ ÀÎÅÍÆäÀ̽º¿¡ ´ëÇÑ À̸§ ¶Ç´Â ¿øº» Ŭ·¡½º¿¡ ´ëÇÑ »õ·Î¿î À̸§À» ÁöÁ¤ÇϽʽÿÀ

Members to Form Interface ÆÐ³Î¿¡¼­, ´ç½ÅÀÌ ÀÎÅÍÆäÀ̽º¿¡ Æ÷ÇԵDZ⸦ ¿øÇÏ´Â ¸Þ¼Òµå¿Í Çʵ带 ¼±ÅÃÇϽʽÿÀ.


´ç½ÅÀÇ Å¬·¡½º´Â ¶Ç ´Ù¸¥ ÀÎÅÍÆäÀ̽º¸¦ ÀÌ¹Ì ½ÇÇàÇß½À´Ï´Ù.  ±× °æ¿ì, ÀÌ ÀÎÅÍÆäÀ̽º´Â Members to Form Interface ¸ñ·Ï¿¡¼­ ³ªÅ¸³¯ °ÍÀÔ´Ï´Ù.  ¸¸ÀÏ ´ç½ÅÀÌ ÃßÃâÇÑ ÀÎÅÍÆäÀ̽º°¡ ±âÁ¸ Çϳª¸¦ È®ÀåÇϱ⸦ ¿øÇϸé, ´ç½ÅÀº ¸ñ·Ï¿¡¼­ ±×°ÍÀ» ¼±ÅÃÇØ¾ß¸¸ ÇÕ´Ï´Ù.  ¸¸ÀÏ ±×·¸Áö ¾Ê´Ù¸é, ÀÌ ÀÎÅÍÆäÀ̽º¸¦ ¼±ÅõÇÁö ¾Ê°Ô ÇϽʽÿÀ. ±×·¯¸é Ŭ·¡½º´Â ÃßÃâÇÏ°í ±âÁ¸ ÀÎÅÍÆäÀ̽º¸¦ ½ÇÇàÇÒ °ÍÀÔ´Ï´Ù.



JavaDoc ±×·ì¿¡¼­, »õ·Î¿î ÀÎÅÍÆäÀ̽º°¡ »ý¼ºµÉ ¶§ Javadoc°¡ ´Ù·ç¾îÁ®¾ß¸¸ ÇÏ´Â ¿É¼Ç ¹öưÀ» ¼±ÅÃÇϽʽÿÀ.

As is  

??? 

Copy  

??? 

Move  

??? 



 3.   OK ¸¦ Ŭ¸¯ÇϽʽÿÀ, ±×¸®°í »õ·Î¿î ÀÎÅÍÆäÀ̽º´Â »ý¼ºµÉ °ÍÀÔ´Ï´Ù.

 4.   ±× ÈÄ, ¸¸ÀÏ ´ç½ÅÀÌ Extract Interface  ¿É¼Ç ¹öưÀ» ¼±ÅÃÇϸé, ´ÙÀ½ À©µµ¿ì°¡ ³ªÅ¸³¯ °ÍÀÔ´Ï´Ù:



¸¸ÀÏ ´ç½ÅÀÌ IDEA°¡ Ŭ·¡½ºÀÇ »ç¿ëÀ» ºÐ¼®Çϰí, °¡´ÉÇϸé ÀÎÅÍÆäÀ̽ºÀÇ »ç¿ëÀ¸·Î ±×µéÀ» ±³Ã¼Çϱ⠹ٶó¸é, Yes À» Ŭ¸¯ÇϽʽÿÀ, ±×·¸Áö ¾Ê´Ù¸é No¸¦ Ŭ¸¯ÇϽʽÿÀ.  »ó¼¼ÇÑ °ÍÀº ¹Ì¸® º¸±â¸¦ º¸½Ê½Ã¿À.

Preview usages to be changed üũ ¹Ú½º¸¦ üũÇÏ¸é ´ç½Å¿¡°Ô »ç¿ëÀÌ ¹ß°ßµÇ°í, ±×µéÀÇ ±³Ã¼¸¦ ½ÂÀÎÇÏ´Â Á¤º¸¸¦ °è¼Ó ¾ò´Â °ÍÀ» Çã¶ôÇÕ´Ï´Ù.  Ã¼Å©µÇÁö ¾ÊÀ» ¶§, IDEA´Â ±³Ã¼¸¦ ÀÚµ¿ÀûÀ¸·Î ¼öÇàÇÕ´Ï´Ù.


½ÉÁö¾î üũ ¹Ú½º°¡ È®ÀεÇÁö ¾Ê¾ÒÀ» ¶§µµ, ¸¸ÀÏ ¹ß°ßµÈ »ç¿ëÀÌ ¾î¶² Àбâ Àü¿ë ÆÄÀÏ¿¡¼­ Á¸ÀçÇÏ¸é ´ç½Å¿¡°Ô »ç¿ë ±³Ã¼¸¦ È®ÀÎÇϱâ À§ÇØ ÇÁ·ÒÇÁÆ® µÉ °Í ÀÔ´Ï´Ù.