리팩터링(refactoring)

리팩터링(refactoring)
1. 정의
– 기존 코드의 설계를 개선하는 절차
– 동작(operation)을 보존하는 변환
-> 겉으로 보이는 동작을 바꾸지 않고, 이해하거나 수정하기 쉽게 소프트웨어의 내부 구조를 바꾸는 것 (Martin Fowler)

2. 리팩터링을 하는 이유
– 새로운 코드를 더 쉽게 추가할 수 있도록 하기 위해
– 기존 코드의 설계를 개선하기 위해
– 기존 코드를 더 잘 이해하기 위해
– 덜 짜증나는 코드로 만들기 위해

“Any fool can write code that a computer can understand. Good programmers write code that humans can understand.
컴퓨터가 이해하는 코드는 어느 바보나 짤 수 있다. 훌륭한 프로그래머는 사람이 이해할 수 있는 코드를 짠다.” – Martin Fowler

<참고>
패턴(pattern) : 반복해 나나타는 설계 문제에 대한 표준 해법
설계 초기 단계부터 패턴을 적용하는 것보다 기존 설계를 개선하는 데 패턴을 사용하는 것이 더 낫다.

Visual Basic.NET의 구조

1. Visual Basic.NET의 소스파일에는 무엇이 들어있나?
– 확장자가 .vb인 소스코드 파일에서는 클래스를 정의
[vbnet]Public Class Dog
‘클래스
End Class[/vbnet]
– 모듈(module) -> 암시적으로 공유되는 클래스의 특수 형태로 볼 수 있음

2. 클래스(class) 안에는 무엇이 들어 있나?
– 메소드(method)가 한 개 이상 들어 있음
[vbnet]Public Class Dog
Sub Bark()
‘메소드
End Sub
End Class[/vbnet]

3. 메소드 안에는 무엇이 들어 있나?
– 처리할 일을 지시하는 내용이 들어있음
-> 일련의 명령문이 들어 있음
[vbnet]Public Class Dog
Sub Bark()
Statement1 ‘명령문
Statement2
End Sub
End Class[/vbnet]

4. 클래스를 해부한다면?
비베닷넷에서는 프로그램을 실행시키기 위한 Main함수, 클래스, 폼을 지정해야 함
시작 함수로서의 Main에 대한 정의는 어떻게 하는가?
[vbnet]Public Class MyFirstApp
Public Shared Sub Main()
End Sub
End Class[/vbnet]
콘솔프로그램을 작성하고자 한다면 다음과 같이 하면 된다.
[vbnet]Public Class MyFirstApp
Public Shared Sub Main()
Console.WriteLine(“Hello, World.”)’내용을 콘솔에 출력한다.
Console.ReadLine()’사용자의 입력을 받아들인다.
End Sub
End Class[/vbnet]

5. Main함수를 가지고 윈도우 프로그램을 실행하려면?
1) Application.Run 메소드를 이용
[vbnet]Public Module StartModule
Public Sub Main()
Dim frm As New Form1()
Application.Run(frm)
End Sub
End Module[/vbnet]
프로그램을 끝낼 때는 Application.Exit()라고 하면 된다.
2) 폼의 ShowDialog메소드를 이용
[vbnet]Public Module StartModule
Public Sub Main()
Dim frm As New Form1()
frm.ShowDialog() ‘modal window를 보여줌.
‘윈도우가 닫힐 때까지는 Main()의 다른 명령은 실행되지 않음
End Sub
End Module[/vbnet]
3) 폼의 Show메소드를 이용
[vbnet]Public Module StartModule
Public Sub Main()
Dim frm As New Form1()
frm.Show() ‘modeless window를 보여줌.
‘Main()가 계속 실행됨
End Sub
End Module[/vbnet]

6. 메소드(method)란?
1) 뭔가를 하는 것
명령문 : 선언, 대입, 메소드 호출 등
2) 뭔가를 여러 번 반복하는 것
순환문 : For, While
For : 반복횟수를 알 때
While : 반복횟수를 모르며, 탈출조건은 알 때.
3) 조건에 따라 뭔가를 하는 것
분기문 : If/Else, Select Case

7. 그렇다면 클래스는 어떻게 설계해야 하는가?
– 클래스를 설계할 때믄 그 클래스 유형으로부터 생성되는 객체에 대해 생각한다.
객체에서 아는 것 -> 인스턴스 변수
객체에서 하는 것 -> 메소드
– 이 클래스가 무엇을 할 것인가(역할-> 메소드)를 먼저 생각한다.
[vbnet]Public Class Song
Dim m_Title As String ‘아는 것 -> 인스턴스 변수(상태)
Dim m_Artist As String

Sub SetTitle() ‘하는 것 -> 메소드(행동)
Sub SetArtist()
Sub Play()
End Class[/vbnet]

– 클래스와 객체 사이에는 어떤 차이가 있는가?
클래스는 객체(인스턴스)를 만들기 위한 청사진 -> 그 유형의 객체를 만드는 방법을 알려주는 역할을 한다
클래스는 하나이나 객체는 여럿이 될 수 있다.

8. 점(.) 연산자
– 클래스 내부의 상태와 행동을 어떻게 참조/호출하는가?
– 점(.) 연산자는 객체의 상태(인스턴스 변수)와 행동(메소드)을 접근할 수 있게 해주는 역할을 한다.
[vbnet]Dim myDog As Dog = New Dog() ‘새로운 객체를 만든다.
myDog.Bark() ‘점 연산자를 myDog변수에 적용하여 Bark()메소드를 호출하여 그 개가 짖도록 한다.
myDog.m_Size = 40 ‘점 연산자를 써서 그 크기를 설정한다.[/vbnet]

[vbnet]Public Class Dog
Dim m_Size As Integer ‘***실제 코딩에서는 상태를 직접 바꾸는 것을 피하자. 상태는 Private으로 선언하여 숨긴다.
Dim m_Breed As String
Dim m_Name As String

Public Sub Bark()
Console.WriteLine(“멍멍”)
End Sub
End Class[/vbnet]

9. 결국 비베닷넷의 프로그램은 무엇이라 할 수 있는가?
-클래스를 통해여 만들어진 객체들의 연극
– 비베닷넷 프로그램이란 객체가 다른 객체와 대화하는 것에 불과함
– 대화한다는 것은 객체에서 서로 다른 객체의 메소드를 호출하는 것을 의미함.

[vbnet]myDog.Bark()[/vbnet]
-> myDog에게 Bark하라고 말함
-> myDog에게 Bark하라는 메시지를 전함
-> myDog이라는 변수로 참조할 수 있는 객체를 이용하여 Bark()라는 메소드를 호출하라는 뜻

– 메시지 = 참조변수 + 점(.)연산자 + 메소드