본문 바로가기
Programing/Knowledge

[Knowledge] Method Chaining (메소드 체이닝)

by 꾸압 2022. 8. 30.

 

<선 요약>

  - 개념은 알되 위험하니 쓰진 말자

 


 

<설명>

  - Function Chaining 이라고도 불림.

  - Method 나 Function을 연달아 써서 code 양(amount) 을 간소하게 함.

  - 다른 method 결과를 호출하기 위해 object 자체를 return 하는 object method.

  - this/that 등의 parent 문법에 효과적.

 


 

<단점>

  (1) Debugging 이 까다로움.

    * break point를 간결히 표현한 지점에 둘 수 있을수도 없을 수도 있으므로, 어디서 어떻게 문제가 발생하였는지 알 수 없을 수 있음.

      ==> 되도록 중간 변수가 있는 별도의 줄바꿈을 두어, 그 부분을 monitoring process로 조사하는 방안이 있음.

    * 많은 IDE가 method 호출을 검사 가능 객체로 평가하지 않기에 debugging 어려움.

 

  (2) chain 된 object를 변경하거나, 다른 object의 API와 유사하다면 상당한 혼란이 야기됨.

  (3) method가 null 이 아닌 유효한 object를 return 한다는 보장이 없음.

  (4) 많은 obejct에 의존할 수 있기에 위험.

    ==> 여러 식료품 점으로 구성된 obejct인 foodStore가 있다. foodStore.getLocalStore() 는 가장 가까운 상점의 정보를 보여한 object 를 매개변수에 return 한다. getPriceforProduct (anything) 는 해당 object의 method 이다.

    ==> 여기서 foodStore.getLocalStore (parameters) .getPriceforProduct (anything) 를 호출하면, foodStore 뿐 아니라 localStore에도 의존하게 됨.

    ==> getPriceforProduct (anything) 가 변경되면 foodStore 뿐 아니라 chained method 를 호출한 클래스도 변경해야 함.

    ** 항상 클래스 간 느슨한 결합을 목표로 해야함.

 


 

<예제 1>

아래는 선과 원을 그리는 java code의 일부다.

// 코드의 일부를 발췌한 Example Method

int main(){
    Line line = new Line();

    line.setStart(new Point(10, 10));
    line.setEnd(new Point(20, 40));
    line.setColor(new Color(255,0,0));

    line.draw();

    Circle circle = new Circle();
    
    circle.setCenter(20, 40);
    circle.setRadius(10);
    circle.setColor(0,0,255);
    circle.setBorderThickness(2);
    circle.setBorderColor(0,255,0);
    
    circle.draw();
}

 

Method Chaining 을 통해 다음으로 요약이 가능하다.

int main(){
    Line.from(10, 10).to(20. 40).withColor(255, 0, 0).draw();
 
    Circle
        .at(20, 40)
        .withRadius(10)
        .withColor(0, 0, 255)
        .withBorder(Border.withThickness(2).withColor(0, 255, 0).build())
        .draw();
}

 


 

<예제 2>

일반적인 JavaScript example

<!DOCTYPE html>
<html>
<head>
    <title>HTML Console</title>
</head>
<body>
    <h3> Output Console </h3>
    <p> Output </p>
    <div id="output"></div>
    <div id="opError" style="color : #ff0000"></div>
    <script>
        var content =''
        var error = ''
        var opDiv = document.querySelector('#output')
        var opErrDiv = document.querySelector('#opError')

        // actual javascript code
        try {
            let s = 'HELLO WORLD JavaScript is Awesome'
            s = s.toLowerCase()
            s = s.replace(/ /g, '|')	// grobally replace all spaces
            s = s.trim()
            content += "Value of s: " + JSON.stringify(s) + '<br>'
        }
        catch (err) {
            error += err
        }
        finally {

            // display on output console
            opDiv.innerHTML = content
            opErrDiv.innerHTML = error
        }
    </script>
</body>
</html>

 

Method Chainging 을 적용한 JavaScript Example

<!DOCTYPE html>
<html>
<head>
    <title>HTML Console</title>
</head>
<body>
    <h3> Output Console </h3>
    <p> Output: </h3>
    <div id="output">
    </div>
    <div id="opError" style="color : #ff0000">
    </div>
    <script>
        var content = ''
        var error = ''
        var opDiv = document.querySelector('#output')
        var opErrDiv = document.querySelector('#opError')
        
        // actual javasript code
        try {
            let s = 'HELLO WORLD JavaScript is Awesome'
            s = s
                .toLowerCase()
                .replace(/ /g, '|')
                .trim()
                
            content += "Value of s: " + JSON.stringify(s) + '<br>'
        }
        catch (err) {
            error += err
        }
        finally {
            
            // display on output console
            opDiv.innerHTML = content
            opErrDiv.innerHTML = error
        }
    </script>
</body>
</html>

 


 

<출처 1> https://okky.kr/articles/565735?note=1662962

<출처 2> https://www.tutorialspoint.com/method-chaining-in-javascript

<출처 3> http://daplus.net/oop-%EB%A9%94%EC%86%8C%EB%93%9C-%EC%B2%B4%EC%9D%B8-%EC%99%9C-%EC%A2%8B%EC%9D%80-%EC%8A%B5%EA%B4%80%EC%9E%85%EB%8B%88%EA%B9%8C/

<출처 4>

 

 

'Programing > Knowledge' 카테고리의 다른 글

[Knowledge] Runtime (런타임)  (0) 2022.09.12
[Knowledge] Parity Bit  (0) 2022.09.08
[Knowledge] Token (토큰)  (0) 2022.08.25
[Knowledge] Domain Specify Language (DSL)  (0) 2022.08.20

댓글