가시성 설계하기

Similar documents
07 자바의 다양한 클래스.key

PowerPoint Presentation

슬라이드 1

PowerPoint Presentation

JAVA PROGRAMMING 실습 08.다형성

객체들이책임을가지고협력하는것을어떻게설계할것인가? applying OO Design principles and the UML 책임을할당하고객체들사이의협력을설계하는것은, 설계시에가장중요하고창조적인작업이다. 2/55

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

PowerPoint Presentation

PowerPoint Presentation

<4D F736F F F696E74202D20C1A63038C0E520C5ACB7A1BDBABFCD20B0B4C3BC4928B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

gnu-lee-oop-kor-lec11-1-chap15

C# Programming Guide - Types

PowerPoint 프레젠테이션

Microsoft PowerPoint - Lect07.pptx

PowerPoint Template

q 이장에서다룰내용 1 객체지향프로그래밍의이해 2 객체지향언어 : 자바 2

PowerPoint Presentation

1

Design Issues

PowerPoint 프레젠테이션

JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각

JAVA PROGRAMMING 실습 05. 객체의 활용

02 C h a p t e r Java

Microsoft PowerPoint 자바-기본문법(Ch2).pptx

Microsoft PowerPoint - Chapter 6.ppt

Microsoft PowerPoint - Lect04.pptx

JVM 메모리구조

PowerPoint 프레젠테이션

Microsoft PowerPoint - 2강

비긴쿡-자바 00앞부속

ilist.add(new Integer(1))과 같이 사용하지 않고 ilist.add(1)과 같이 사용한 것은 자바 5.0에 추가된 기본 자료형과 해당 객체 자료 형과의 오토박싱/언박싱 기능을 사용한 것으로 오토박싱이란 자바 컴파일러가 객체를 요구하는 곳에 기본 자료형

슬라이드 1

class Sale void makelineitem(productspecification* spec, int qty) SalesLineItem* sl = new SalesLineItem(spec, qty); ; 2. 아래의액티비티다이어그램을보고 Java 또는 C ++,

슬라이드 1

gnu-lee-oop-kor-lec06-3-chap7

A Dynamic Grid Services Deployment Mechanism for On-Demand Resource Provisioning

구조체정의 자료형 (data types) 기본자료형 (primitive data types) : char, int, float 등과같이 C 언어에서제공하는자료형. 사용자정의자료형 (user-defined data types) : 다양한자료형을묶어서목적에따라새로운자료형을

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi

Microsoft PowerPoint - ch09 - 연결형리스트, Stack, Queue와 응용 pm0100

adfasdfasfdasfasfadf

Mobile Service > IAP > Android SDK [ ] IAP SDK TOAST SDK. IAP SDK. Android Studio IDE Android SDK Version (API Level 10). Name Reference V

소프트웨어개발방법론

Lab 3. 실습문제 (Single linked list)_해답.hwp

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

Microsoft PowerPoint - chap03-변수와데이터형.pptx

쉽게 풀어쓴 C 프로그래밍

(8) getpi() 함수는정적함수이므로 main() 에서호출할수있다. (9) class Circle private double radius; static final double PI= ; // PI 이름으로 로초기화된정적상수 public

ThisJava ..

JUNIT 실습및발표

PowerPoint 프레젠테이션

untitled

Microsoft PowerPoint - 8ÀÏ°_Æ÷ÀÎÅÍ.ppt

Spring Data JPA Many To Many 양방향 관계 예제

PowerPoint Presentation

Microsoft PowerPoint - lec2.ppt

슬라이드 1

K&R2 Reference Manual 번역본

제11장 프로세스와 쓰레드

chap10.PDF

PowerPoint Presentation

Microsoft PowerPoint - 3ÀÏ°_º¯¼ö¿Í »ó¼ö.ppt

Microsoft PowerPoint - 13_UMLCoding(2010).pptx

쉽게 풀어쓴 C 프로그래밊

UML 인터랙션 다이어그램 표기법 (UML Interaction Diagram)

@OneToOne(cascade = = "addr_id") private Addr addr; public Emp(String ename, Addr addr) { this.ename = ename; this.a

PowerPoint 프레젠테이션

JAVA PROGRAMMING 실습 02. 표준 입출력

PowerPoint Presentation

Microsoft PowerPoint - C++ 5 .pptx

chap 5: Trees

쉽게 풀어쓴 C 프로그래밍

05-class.key

chap x: G입력

Microsoft PowerPoint - Chap12-OOP.ppt

C++ Programming

소프트웨어공학개론 강의 11: UML 코드매핑 최은만동국대학교컴퓨터공학과

PowerPoint 프레젠테이션

A Hierarchical Approach to Interactive Motion Editing for Human-like Figures

11 템플릿적용 - Java Program Performance Tuning (김명호기술이사)

thesis

교육자료

UML 클래스 다이어그램 표기법 (UML Class Diagram)

쉽게 풀어쓴 C 프로그래밍

JAVA PROGRAMMING 실습 02. 표준 입출력

유니티 변수-함수.key

Microsoft PowerPoint - 04-UDP Programming.ppt

Microsoft PowerPoint - ch07 - 포인터 pm0415

10.0pt1height.7depth.3width±â10.0pt1height.7depth.3widthÃÊ10.0pt1height.7depth.3widthÅë10.0pt1height.7depth.3width°è10.0pt1height.7depth.3widthÇÁ10.0pt1height.7depth.3width·Î10.0pt1height.7depth.3width±×10.0pt1height.7depth.3width·¡10.0pt1height.7depth.3width¹Ö pt1height.7depth.3widthŬ10.0pt1height.7depth.3width·¡10.0pt1height.7depth.3width½º, 10.0pt1height.7depth.3width°´10.0pt1height.7depth.3widthü, 10.0pt1height.7depth.3widthº¯10.0pt1height.7depth.3width¼ö, 10.0pt1height.7depth.3width¸Þ10.0pt1height.7depth.3width¼Ò10.0pt1height.7depth.3widthµå

11장 포인터

PowerPoint Presentation

01-OOPConcepts(2).PDF

C++ Programming

금오공대 컴퓨터공학전공 강의자료

Microsoft PowerPoint - Introduction to Google Guava.pptx

쉽게 풀어쓴 C 프로그래밍

KNK_C_05_Pointers_Arrays_structures_summary_v02

쉽게

Connection 8 22 UniSQLConnection / / 9 3 UniSQL OID SET

Microsoft PowerPoint - additional01.ppt [호환 모드]

Transcription:

가시성설계하기

목표 다른객체에보여줄범위를결정하는가시성설계방법을이해하고활용할수있다. 2

객체간의가시성 객체간의가시성 enteritem 같이송신자가수신자에게보내는메시지 송신자객체는수신자객체를볼수있어야한다. 아울러메시지를받을수있도록보이게설계해야한다. class Register... private ProductCatalog catalog;... enteritem (itemid, quantity) : Register desc = getproductdesc( itemid ) : ProductCatalog public void enteritem( itemid, qty )... desc = catalog.getproductdesc(itemid)... 3

가시성의정의 가시성 (visibility) 이란 한객체가다른객체를보거나참조를가지고있는것 객체의가시범위 (scope) 와관련이있음. 네가지가시성 : 객체 A에서 B로의가시성 속성가시성 : B는 A의속성이다. 매개변수가시성 : B는 A의한메소드의매개변수이다. 지역가시성 : B는 A의지역객체이다. 전역가시성 : B는어떤경우에서나전역적으로볼수있다. 객체 A 가객체 B 로메시지를보내려면객체 A 는반드시객체 B 를볼수있어야한다. 가시성 - 4

속성가시성 객체 B 가 A 의속성이되도록설계 public class Register private ProductCatalog catalog; public enteritem(itemid id, int qty) catalog.getproductdesc(id); class Register... private ProductCatalog catalog;... public void enteritem(itemid, qty)... desc = catalog.getproductdesc(itemid)... enteritem (itemid, quantity) : Register desc = getproductdesc( itemid ) : ProductCatalog 5

매개변수가시성 객체 B 가 A 의메소드의매개변수로보냄 enteritem(id, qty) :Register 2: makelineitem(desc, qty) :Sale 1: desc = getproductdesc(id) 2.1: create(desc, qty) :Product Catalog makelineitem(productdescription desc, int qty)... sl = new SalesLineItem(desc, qty);... sl : SalesLineItem enteritem(id, qty) :Register 2: makelineitem(desc, qty) :Sale 2: desc = getproductdesc(id) 2.1: create(desc, qty) :Product Catalog sl : SalesLineItem // initializing method (e.g., a Java constructor) SalesLineItem(ProductDescription desc, int qty)... description = desc; // parameter to attribute visibility... 6

지역가시성 지역가시성을구현하는두가지방법 새로운인스턴스를생성하여지역변수에할당 호출에의해반환된객체를지역변수에할당 enteritem(id, qty)... // local visibility via assignment of returning object ProductDescription desc = catalog.getproductdes(id);... enteritem (itemid, quantity) : Register desc = getproductdesc( itemid ) : ProductCatalog 7

전역가시성 객체를전역변수에할당 : C++ 싱글톤패턴을사용하는법 : 정적변수및정적함수를이용하여객체의위치를제공 8

설계를코딩으로매핑하기

목표 UML 설계도를보고이를객체지향언어로코딩할수있다. 설계모델과구현모델의차이점을이해한다. 10

1. 프로그래밍과반복적이고진화적인개발 코드생성은 OOAD 의최종목표이다. 구현에서의창조성과변화 설계모델은구현측면에서불완전한아이디어에대한스케치일뿐이다. 설계모델에서구현모델을만들어내는것은기계적이지만불완전하다. 따라서프로그래밍과테스트과정에서많은변화가있을수있음을받아들인다. 극단적으로설계에서아예벗어날수도있다는것을예상해야한다. 11

2, 설계를코드로매핑하기 클래스및인터페이스정의 ( 해더파일작성 ) 메소드정의 ( 구현파일작성 ) 12

3. 설계클래스도로부터클래스정의생성 설계클래스도 (Design Class Diagram) 클래스, 인터페이스, 슈퍼클래스, 연산의시그너쳐, 속성등의정보가포함 연산과속성이정의된클래스정의 비교적간단 연습 ) Sale public class SalesLineItem private int quantity; private ProductDescription description; public SalesLineItem(ProductDescription desc, int qty)... public Money getsubtotal()... SalesLineItem quantity : Integer getsubtotal() : Money description 1 ProductDescription description : Text price : Money itemid : ItemID... 13

4. 상호작용다이어그램에서메소드생성 SO enteritem(id,qty) 에대한구현 public class Register private ProductCatalog catalog; Private Sale currentsale; public enteritem(itemid id, int qty) ProductDesc desc = catalog.getproductdesc(id); currentsale.makelineitem(desc,qty); enteritem(id, qty) :Register 2: makelineitem(desc, qty) :Sale 1: desc = getproductdesc(id) 2.1: create(desc, qty) :Product Catalog sl: SalesLineItem 1.1: desc = get(id) 2.2: add(sl) : Map<ProductDescription> lineitems : List<SalesLineItem> 14

클래스정의 Register 클래스 public class Register private ProductCatalog catalog; private Sale currentsale; public Register(ProductCatalog pc)... public void endsale()... public void enteritem(itemid id, int qty)... public void makenewsale()... public void makepayment(money cashtendered)...... Register endsale() enteritem(id: ItemID, qty : Integer) makenewsale() makepayment(cashtendered : Money) catalog 1 currentsale 1... ProductCatalog getproductdesc(...) Sale iscomplete : Boolean time : DateTime becomecomplete() makelineitem(...) makepayment(...) gettotal() 15

컬랙션 List<T>, vector<t> 등의컨테이너템플릿클래스사용 public class Sale... private List lineitems = new ArrayList(); Sale iscomplete : Boolean time : DateTime becomecomplete() makelineitem() makepayment() getttotal() lineitems 1..* SalesLineItem quantity : Integer getsubtotal() A collection class is necessary to maintain attribute visibility to all the SalesLineItems. 16

객체의생성과등록 public class Sale private List<SalesLineItem> lineitems; public Sale() lineitems = new ArrayList; public makelineitem(productdesc desc, int qty) lineitems.add(new SalesLineItem(desc,qty); lineitems.add( new SalesLineItem(desc, qty) ); enteritem(id, qty) :Register 2: makelineitem(desc, qty) :Sale 2.2: add(sl) 2.1: create(desc, qty) lineitems : List<SalesLineItem> sl: SalesLineItem 17

테스트주도개발 (Test Driven Development) 테스트프로그램을먼저개발하고본프로그램을테스트프로그램에통과하도록채워가는코딩방식 Assertion 사용 ( 참이어야하는조건 ) XP 에서장려 테스트환경 : xunit (x = java C++) www.xunit.org 18

구현순서 결합도가낮은클래스부터높은클래스순 각클래스별로단위시험하면서개발 예 ) 결합도낮은클래스 : Payment, ProductDesc 높은클래스 : 위를의존하는 ProductCatalog, SalesLineIitem 구현 Store 7 address : Address name : Text addsale(...) 1 1 ProductCatalog... getproductdesc(...) 3 1..* ProductDescription description : Text price : Money itemid : ItemID... 2... 1 Register endsale() enteritem(...) makenewsale() makepayment(...) 6 1 Sale iscomplete : Boolean time : DateTime becomecomplete() makelineitem(...) makepayment(...) gettotal()... 5 1..* 1 SalesLineItem quantity : Integer getsubtotal() 4 * Payment 1 1 amount : Money 19...

프로젝트 #3 프로젝트 #1 에서의하나의유스케이스를선정하여다음을작성하여라. 단, UI 는옵션임. UC 텍스트작성 SSD Domain Model OC (SSD 에서발췌한 2 개이상 ) DCD/DSD ( 발취한 2 개이상에대해서각각 ) 코드 (Java 또는 C++) 20

Money.java package nextgenpos.domain; public class Money private double amount; private String currency; public Money(double amount, String currency) this.amount = amount; this.currency = currency; public Money(double amount) this.amount = amount; this.currency = "WON"; public Money() this.currency = "WON"; this.amount = 0; public void setamount(int amount) this.amount = amount; public void setcurrenty(string currency) this.currency = currency; public double getamount() return amount; public String getcurrency() return currency; public Money times(double pro) return new Money(amount * pro, currency); public Money minus(money my) return new Money(amount - my.getamount(), currency); public Money plus(money my) return new Money(amount + my.getamount(), currency); public void add(money my) this.amount += my.getamount(); 21

ItemID.java package nextgenpos.domain; public class ItemID private int id; public ItemID(int id) this.id = id; public int getitemid() return id; 22

컬렉션일반클래스 : Collection

목표 JAVA 의 collection 클래스들의종류를살펴본다. 사용법을익힌다. JDBC 의사용법을익힌다. 24

Iterable::Collection::List::AbstractList::Vector 추가되는순서로객체를저장 특정위치에추가삭제가능 모든메소드는동기화됨 (thread-safe) List 인터페이스를구현한것임 (add(), addelement()) 요즘은 vector 보다 ArrayList를더많이사용 25

다중원소들의관리방법을제공하는클래스들 Collection List Set Map 동일한형태의객체들을모아두는클래스 일반클래스 ( 템플릿클래스 ) 어떤형태의객체들도사용가능 예 ) ArrayList<String>, ArrayList<Student>, 제공되는연산 add(object o), remove(object o), contains(object o), iterator(), size(), get(int index) 제거 (remove) 할때에는모음안에동일한객체일때만수행 Collection 을확장하여모음안에어떤인덱스에객체를삽입 (insert) 과삭제 (delete) 가가능한인터페이스 원소의중복이없는 Collection 으로중복을방지하기위해원소의비교능력이포함됨. 추가 (add) 연산의결과는추가가성공또는실패의불리언값임. Collection과별도로추가, 제거, 조회할때 Key 값을기준으로수행 제공되는연산 get(object key), put(object key, Object value), remove(object key), containskey(object key), containsvalue(object value), keyset(), entryset() 인덱스형태의조회는제공하지않음 26

Collection class hierarchy : List and Set 27

Collection class hierarchy : Map 28

Iterable::Collection::List::AbstractList::ArrayList Vector 와같이추가되는순서로객체를저장 다만, 메소드가동기화되지않음 (thread-unsafe) 요즘은 Collection 차원의동기화 API 가제공됨 29

Iterable::Collection::Set::StoredSet::TreeSet 순차적으로객체를저장하되비교연산을통해정렬되고, 중복을허용하지않음 비교가능한객체들을별도의 Comparator 비교연산객체를통해순서를정해저장 균형트리를이용한트리형태의집합 중복을허용하지않으므로비교연산은동일한객체를판별할수있어야함. 30

Iterable::Collection::Set::AbstractSet::HashSet Set을제공하기위해 Hash 방법을사용 중복된원소를허용하지않음 내부적으로 hashcode 값을사용하여원소를관리 동기화되지않음 31

Hashtable 모든메소드는동기화됨 Vector 와같이복제방법을제공 32

Iterator 인터페이스사용 Collection은 iterator() 메소드를제공하여 Iterator 객체를반환 Iterator 인터페이스함수들 boolean hasnext() : 가져올다음원소가있으면 true 반환 Object next() : 다음원소를가져다줌 33

Collection 사용법 ( 예 ) import java.util.arraylist; import java.util.collection; import java.util.iterator; // or import java.util.*; public class collection2 public static void main(string[] args) Collection c = new ArrayList<String>(); c.add("rose"); c.add("lotus"); c.add("marigold"); c.add("jasmine"); Iterator ir = c.iterator(); while (ir.hasnext()) System.out.println(ir.next()); 34

추가예 import java.util.*; public class CollectionsTest public static void main(string[] args) List l = new ArrayList<Integer>(); Map m = new TreeMap(); Set s = new TreeSet<Integer>(); l.add(new Integer(1)); l.add(new Integer(4)); l.add(new Integer(3)); m.put(new Integer(1), "A"); m.put(new Integer(4), "B"); m.put(new Integer(3), "C"); s.add(new Integer(1)); s.add(new Integer(4)); s.add(new Integer(3)); System.out.println("List"); Iterator i = l.iterator(); while (i.hasnext()) System.out.println(i.next()); System.out.println("Map using keys"); i = m.keyset().iterator(); while (i.hasnext()) System.out.println(m.get(i.next())); System.out.println("Map using entries"); i = m.entryset().iterator(); while (i.hasnext()) System.out.println(i.next()); System.out.println("Set"); i = s.iterator(); while (i.hasnext()) System.out.println(i.next()); 35

일반클래스예 HashMap hm = new HashMap(); List al = new ArrayList(); // hashmap name.put(key, value); hm.put("name"," 진우 "); hm.put("nick"," 쪼 "); al.add( hm ); // hashmap name.put(key, value); hm = new HashMap(); hm.put("name"," 애희 "); hm.put("nick"," 줴인 "); al.add( hm ); // for 문내에사용되는변수들, 출력한다. HashMap gethm = new HashMap(); String sname = null; String snick = null; for ( int i=0; i<al.size(); i++ ) gethm = (HashMap)al.get(i); sname = (String)getHm.get("name"); snick = (String)getHm.get("nick"); out.println( (i+1)+" 번째이름 : "+sname+", 애칭 : "+snick+"<br>" ); 36

비교 [SET ] HashSet 동기화 X 가장빠른집합, HashMap 보다느림 TreeSet 동기화 X HashSet 보다느림, 키가정렬됨 [ MAP ] HashMap 동기화 X 가장빠름, null 값허용 Hashtable 동기화 O HashMap 보다느림, 동기화, null 값허용안함 TreeMap 동기화 X Hashtable 과 HashMap 보다느림, 키가정렬됨 [ LIST ] ArrayList 동기화 X 가장빠름, null 허용 LinkedList 동기화 X 느림 Vector 동기화 O ArrayList 보다느림 Stack 동기화 O Vector 와동일한속도, LIFO 가능 37

Generic Class: ArrayList<E> public class ArrayList<E>... public void add(int index, E element)...... public E get(int index)... // E 는임의의클래스 38

MySQL 과자바의연결 (JDBC 사용법 ) 참고문헌 http://second27.egloos.com/4232834 필요소프트웨어 JDK, MySQL, MySQL JDBC 드라이버 (.http://www.mysql.com/downloads/api-jdbc.html) Apach, PHP, MySQL 설치 : APM Setup.exe 39

코딩스타일 : Hungarian Notations and More

Standard Coding Style Code Readability - 가독성 누구나읽기쉽고, 이해하기쉬우며, 코딩의실수를완화해주기위함 Coding Standard 식별자 ( 파일명, 함수, 변수, 클래스 ) 명명법의표준화 블록들여쓰기의표준화 설명주석의표준화 함수흐름의표준화 디버그문장삽입표준화 에러처리의표준화 Extreme Programming Pair Programming 41

Coding Habits 코딩에집중하고성능을높일수있는환경을익혀라 예 코딩중에는가급적키보드만사용할것 자신이자주사용하는단축키는외울것 디버깅하기쉽도록코드를작성할것 반복작업을편하게해줄도구를찾을것 목적하는바를이룰가장빠른길을찾을것 구현중에는생각의흐름을끊지말것 단축키 : Ctrl-C, Ctrl-V, Alt-F-S (Ctrl-S), F5, F7, F11, F12, F1 메모 : PrintScreen, 윈도키 +R > mspaint, notepad 디버거 / 컴파일에러메시지 42

Naming Standard Hungarian Notation Microsoft 사개발자 Chargles Symonyi ( 헝가리 ) 가처음으로제안한변수명명에관한표준화 변수타입, 변수의범위, 복합명칭 개발자는더이상변수명명에고민을하지않아도됨 기본형식 Id = Scope + Type + RealName scope_typename scope = g m a s g: 전역변수, m: 클래스멤버변수, a: 함수인자 ( 파라미터 ), s: 정적변수 Type : 변수형 ( 표 ) Name: 변수를표현하는적절한단어 ( 첫글자는대문자 ) 43

Prefix for Scope Prefix Scope Description Example g_ 전역변수전역변수앞에붙임 int g_ncount; 없음지역변수지역변수는범위표현안함 void foo() int ncount; m_ 클래스클래스멤버변수 class CFoo private: int m_ncount; s_ 정적변수파일 / 클래스변수 static int s_ncount; class Cfoo static int m_ncount;// s 는생략무방 a_ 매개변수함수의매개변수 int Hoo(int a_ncount, char * a_szname) 44

Prefix for Built-in Types Prefix Data Type Description Example b BOOL 불리언 true/false BOOL btrue; c char 문자형 char cletter; i int 인덱스용정수 int icars; n int 수, 수량을표현하는정수 int nnum; l long 배정도정수 long ldistance; u unsigned 양의정수 unsigned upercent f float 실수 float fpercent; d, dbl double 배정도실수 double dpercent; w WORD 워드 WORD wcnt dw DWORD 부호없는워드 DWORD dwlength p * 포인터 int *piaddr; pfn * 함수포인터 int (*pifnfunc1)(int x, int y); a,rg array 배열 float atemp[16]; sz * 널로끝나는문자배열 char sztext[16]; t, st struct 구조체변수 e enum 열거형변수 eblue, ered, eyellow k r constant formal parameter reference formal parameter 상수형변수 참조변수 void vfunc(const long a_klgalaxies) void vfunc(long &rlgalaxies) prg... 동적배열포인터 char *prggrades; v void void * pvaddress; x/y... X, Y, Z 축 int xwitdth, yheight; h handle 핸들러 hmenu 45

Prefix for User Defined Types Prefix Type Description Example C class 클래스명칭앞에붙임 class CPointer ST, S struct 구조체명칭앞에붙임 typedef struct SPointer E enum 클래스멤버변수 typedef enum ered, eblue EColor I Interface 인터페이스타입 public interface IListener (java) class IListener (C++) 46

User Naming 명명 의미없는이름은절대! 사용하지말아라 일반적인이름도가급적사용하지말것 함수명칭 동사형을선택 예 : Get, Set, Put, Send, Receive 변수명칭 명사형을선택 예 : Human, Concert, Student, 복합명칭 첫글자는대문자로시작 복합단어시새로운단어가시작될때첫글자대문자 예 : GetClassName, WriteToFile, ChildAudience 47

Indentation ( 들여쓰기, 띄어쓰기 ) 함수 / 클래스블록 블록시작은함수의깊이와같게하고새로운줄에시작 예 ) int SetName(char * a_sznname) 조건블록 새로운줄에 if 문과같은깊이로시작 예 ) if (.) 타입과변수사이정렬 여러변수를선언할때에는정렬하는것이가독성좋음. 예 ) int ncount; char * szname; 48

Class Member Order 가시성 public protected private 순서 호출빈도 외부에서접근하는함수, 빈번히접근하는함수등을가장먼저 관계있는함수들끼리묶어서위치 인터페이스를구현한클래스의경우 인터페이스를정의한함수들을맨앞에위치 예 ) class CDummy public: virtual void PublicService(); void WriteToFail() public: CDummy(); ~CDummy(); protected: char * GetClassName(); private: char m_szclassname[256]; 49

Simplification of Control Flow 하나의책임만! 응집도최상 함수하나에는하나의기능 ( 책임 ) 만을부여할것 복합기능 여러개의함수로나누고, 복합하는함수에서호출 한함수에서조건문이여러개있을때 함수첫부분에서에러를먼저처리 끝부분에실제해야할기능을구현 bool Function() if ( 조건 1 & 조건 2) if ( 조건 3) if ( 조건 4). 실제코드 return TRUE; return FALSE; bool Function() if (!( 조건 1 & 조건 2)) return FALSE; if (! 조건 3) return FALSE; if (! 조건 4) return FALSE;. 실제코드 ; return TRUE; 50

Comment 함수의흐름을나타내는주석은반드시달자! ( 알고리즘, 처리단계 ) 예 ) /* Step1: 사용자입력을받는다 */ /* Step2: 입력을검사하고, 처리한다. */ /* Step3: 결과를출력한다 */ 코드를수정할개발자 ( 나, 동료 ) 가꼭알아야될주의사항 ( 작성날짜와작성자명시 ) 적절하게달자 코드만읽어도쉽게알수있는것은불필요 함수기능설명 ( 외부로노출되는함수 ) 소스코드파일작성자및날짜, 외부노출함수, 변수등의설명 51

Debugging Code DEBUG 매크로의사용 #if defined(debug). 디버그코드 #endif 컴파일에러메시지 디버거활용 Breakpoint, step in, step over, run to cursor, watch, stack,... 52

Using typedef 자주쓰이는긴타입은간단명료하게타입명칭을재정의 unsigned char ucport; typedef unsigned char u8_t; u8_t ucport; typedef enum ered, eblue EColor; EColor eclothcolor; typedef struct _Pointer int x; int y; SPointer, *PSPointer; 53

Example Codes to confirm SWU coding style int g_ncnt; // 정수형글로벌카운터 unsigned char ucbyte; // 한바이트데이타 char cchar; // 한문자 unsigned char rgucbyte[10]; // 바이트데이타 10 개 char rgcchar[10]; // 문자데이터 10 개 char szchar[16 +1]; // 문자 16 개를저장할수있는문자열 54

Reference 위키백과 http://en.wikipedia.org/wiki/hungarian_notation 문우식, 패턴그리고객체지향적코딩의법칙, 한빛미디어, 2011. 최은만, 소프트웨어공학, 2011. 55