android coding convention - kangwon · 2016-06-02 · android coding convention by suan lee 12. ......

23
Android Coding Convention Android Coding Convention Suan Lee http://www.webdizen.net 1 Android Coding Convention by Suan Lee

Upload: others

Post on 06-Jul-2020

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Android Coding Convention - Kangwon · 2016-06-02 · Android Coding Convention by Suan Lee 12. ... * Unless required by applicable law or agreed to in writing, software * distributed

Android Coding ConventionAndroid Coding Convention

Suan Leehttp://www.webdizen.net

1Android Coding Convention by Suan Lee

Page 2: Android Coding Convention - Kangwon · 2016-06-02 · Android Coding Convention by Suan Lee 12. ... * Unless required by applicable law or agreed to in writing, software * distributed

코딩 규칙 (Coding conventions)코딩 규칙 (Coding conventions)딩 규칙 g딩 규칙 g

“특정 언어의 프로그래밍 스타일을 안내하는 가이드”파일 구성, 줄맞춤, 주석, 선언, 문장, 공백, 이름 짓기, 관례

“소스 코드를 읽기 쉽다”

“소프트웨어 유지보수가 쉬워진다”

2Android Coding Convention by Suan Lee

Page 3: Android Coding Convention - Kangwon · 2016-06-02 · Android Coding Convention by Suan Lee 12. ... * Unless required by applicable law or agreed to in writing, software * distributed

코딩 규칙의 의미코딩 규칙의 의미딩 규칙의 의미딩 규칙의 의미

소프트웨어 유지보수리팩토링가독성가독성

프로그래밍 오류

3Android Coding Convention by Suan Lee

Page 4: Android Coding Convention - Kangwon · 2016-06-02 · Android Coding Convention by Suan Lee 12. ... * Unless required by applicable law or agreed to in writing, software * distributed

컴파일 오류컴파일 오류파 류파 류

• ‘{‘ 등이 빠져서 발생하는 오류• 대부분이 구문(syntax) 오류• 타이핑 오류나 문법에 맞지 않아 발생타이핑 오류나 문법에 맞지 않아 발생• 컴파일 시 오류 내용을 확인할 수 있음

가장 고치기 쉬움• 가장 고치기 쉬움

4Android Coding Convention by Suan Lee

Page 5: Android Coding Convention - Kangwon · 2016-06-02 · Android Coding Convention by Suan Lee 12. ... * Unless required by applicable law or agreed to in writing, software * distributed

런타임 오류런타임 오류타 류타 류

• 프로그램 실행 중에 발생하는 오류• 특정 상황에서 발생• ‘ret=anyValue/someValue’ 에서 someValue가 0인ret=anyValue/someValue 에서 someValue가 0인

상황 (divide by zero)• 개발자의 경험이 필요• 개발자의 경험이 필요• 직관적으로 다양한 예외사항 파악 필요• 여러 가지 보호 도구 사용

5Android Coding Convention by Suan Lee

Page 6: Android Coding Convention - Kangwon · 2016-06-02 · Android Coding Convention by Suan Lee 12. ... * Unless required by applicable law or agreed to in writing, software * distributed

논리 오류논리 오류리 류리 류

• 코딩 작업의 결과와 다르게 동작하는 경우• 오류를 찾고 수정하기 까다로움• 알고리즘에 대한 잘못된 구현알고리즘에 대한 잘못된 구현• 단순한 코딩 실수로 발생

if(someValue = 1)funcDoSomething();funcDotheOtherthing();

if(1=comeValue) {funcDoSomething();funcDotheOtherthing();

}g(); }

규칙 1: 비교 연산을 사용할 경우 반드시 상수를 비교 연산자 앞에 위치규칙 2: if 문은 반드시 ‘{‘ ‘}’를 사용규칙 2: if 문은 반드시 { , } 를 사용

6Android Coding Convention by Suan Lee

Page 7: Android Coding Convention - Kangwon · 2016-06-02 · Android Coding Convention by Suan Lee 12. ... * Unless required by applicable law or agreed to in writing, software * distributed

코딩 규칙과 실행 프로그램의 관계코딩 규칙과 실행 프로그램의 관계딩 규칙과 행 의 계딩 규칙과 행 의 계

코딩 규칙으로 바이너리에 영향

코드의 가독성 개선 → 개발자 간의 코드 공유코드의 가독성 개선 → 개발자 간의 코드 공유

쉬운 유지보수쉬운 유지보수

정기적인 리팩토링에 도움

문서 자동화 가능

7Android Coding Convention by Suan Lee

Page 8: Android Coding Convention - Kangwon · 2016-06-02 · Android Coding Convention by Suan Lee 12. ... * Unless required by applicable law or agreed to in writing, software * distributed

Java 언어 규칙Java 언어 규칙어 규칙어 규칙

• Exceptions: 설명 없이는 절대 catch 하거나 무시하지 마라

void setServerPort(String value) {void setServerPort(String value) {try {

serverPort = integer.parseInt(value);} catch (NumberFormatException e) {}}

}

– 합당한 이유로 exception을 무시할 경우, 이에 대한 주석을 달아야 함

8Android Coding Convention by Suan Lee

Page 9: Android Coding Convention - Kangwon · 2016-06-02 · Android Coding Convention by Suan Lee 12. ... * Unless required by applicable law or agreed to in writing, software * distributed

Java 언어 규칙Java 언어 규칙어 규칙어 규칙

1) 메소드를 호출한 쪽으로 exception을 올림

void setServerPort(String value) throws NumberFormatException {serverPort = integer.parseInt(value);

}

2) exception을 추상화한 후에 호출한 쪽으로 보냄

}

void setServerPort(String value) throws ConfigurationException{try {

serverPort = integer.parseInt(value);g} catch (NumberFormatException e) {

throw new ConfigurationException(“Port “ + value + “ is not valid.”);

}}

9Android Coding Convention by Suan Lee

Page 10: Android Coding Convention - Kangwon · 2016-06-02 · Android Coding Convention by Suan Lee 12. ... * Unless required by applicable law or agreed to in writing, software * distributed

Java 언어 규칙Java 언어 규칙어 규칙어 규칙

3) exception 처리 후, ‘catch’ 블록에서 적당한 값void setServerPort(String value) {

try {serverPort = Integer.parseInt(value);

} catch (NumberFormatException e) {} catch (NumberFormatException e) {serverPort = 80;

}}

4) exception 된 것을 ‘RuntimeException’ 으로 보냄void setServerPort(String value) {

try {try {serverPort = integer.parseInt(value);

} catch (NumberFormatException e) {throw new RuntimeException(“Port “ + value + “ is not valid.”,

e););}

}

10Android Coding Convention by Suan Lee

Page 11: Android Coding Convention - Kangwon · 2016-06-02 · Android Coding Convention by Suan Lee 12. ... * Unless required by applicable law or agreed to in writing, software * distributed

Java 언어 규칙Java 언어 규칙어 규칙어 규칙

• Exceptions: 일반적인 오류(generic exception)를catch 하지 마라 (스택의 최상단 라이브러리 코드는 제외)

try {ysomeComplicatedIOFunction();someComplicatedParsingFunction();someComplicatedSecurityFunction();

} catch (Exception e) {handleError();

}

– 각 try당 분리된 catch 블록으로 처리– 여러 개의 try 블록으로 리팩토링

이 수준에서 예외처리가 필요 없을 경우 다시 예외를 보냄– 이 수준에서 예외처리가 필요 없을 경우, 다시 예외를 보냄– 컴파일러는 실행 시간에 일어날 문제를 코드에서 잡을 뿐임

11Android Coding Convention by Suan Lee

Page 12: Android Coding Convention - Kangwon · 2016-06-02 · Android Coding Convention by Suan Lee 12. ... * Unless required by applicable law or agreed to in writing, software * distributed

Java 언어 규칙Java 언어 규칙어 규칙어 규칙

• Finalizers: 일반적으로 사용 하지 마라– finalizer는 object가 가비지 컬렉션을 수행할 때, 특정 코드가 실행될

수 있도록 함언제 finalizer가 호출될지 아니면 호출되기는 하는지 보장 못함– 언제 finalizer가 호출될지 아니면 호출되기는 하는지 보장 못함

• Import: 한정적인 import 사용 i t f *• Import: 한정적인 import 사용– 많은 양의 import 문을 줄임

어떤 class가 사용되는지 확실함

import foo.*;import foo.Bar;

– 어떤 class가 사용되는지 확실함– Java 표준 라이브러리, 단위 테스트 코드는 예외

12Android Coding Convention by Suan Lee

Page 13: Android Coding Convention - Kangwon · 2016-06-02 · Android Coding Convention by Suan Lee 12. ... * Unless required by applicable law or agreed to in writing, software * distributed

Java 스타일 규칙Java 스타일 규칙타 규칙타 규칙

• 주석/문서화– 모든 파일에는 ‘Copyright’ 문구가 처음– ‘package’문과 ‘import’ 문 순서로 기술g– 각 블록은 공백으로 구별– javadoc 주석을 이용해 class와 interface의 역할 기술j

13Android Coding Convention by Suan Lee

Page 14: Android Coding Convention - Kangwon · 2016-06-02 · Android Coding Convention by Suan Lee 12. ... * Unless required by applicable law or agreed to in writing, software * distributed

Java 스타일 규칙Java 스타일 규칙타 규칙타 규칙

• 주석/문서화 예/** Copyright (C) 2007 The Android Open Source Project** Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with the License.* You may obtain a copy of the License at You may obtain a copy of the License at** http://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied., p p* See the License for the specific language governing permissions and* limitations under the License.*/

package com.android.internal.foo;

import android.os.Blah;import android.view.Yada;

import java.sql.ResultSet;import java.sql.SQLException;

/**/*** Does X and Y and provides an abstraction for Z.*/public class Foo {...}

14Android Coding Convention by Suan Lee

Page 15: Android Coding Convention - Kangwon · 2016-06-02 · Android Coding Convention by Suan Lee 12. ... * Unless required by applicable law or agreed to in writing, software * distributed

Java 스타일 규칙Java 스타일 규칙타 규칙타 규칙

• 짧은 메소드– 메소드가 40줄을 넘는다면, 프로그램 구조에 영향을 주지

않는 전제 하에서 분리할 수 있는지 생각

• 지역 변수– 변수의 범위는 최소한으로 유지– 가독성을 높이고, 유지보수를 쉽게 하며, 오류 가능성 줄임

• import 순서import 순서– 안드로이드, 써드파티 라이브러리, java, javax 순서– 알파벳 순으로 정렬 대문자는 소문자 앞에 위치알파벳 순으로 정렬, 대문자는 소문자 앞에 위치– 중요 그룹 사이에는 공백 삽입

15Android Coding Convention by Suan Lee

Page 16: Android Coding Convention - Kangwon · 2016-06-02 · Android Coding Convention by Suan Lee 12. ... * Unless required by applicable law or agreed to in writing, software * distributed

Java 스타일 규칙Java 스타일 규칙타 규칙타 규칙

• 들여쓰기– 블록은 공백 4개, 라인 랩에는 공백 8개– 공백은 여러 명이 탭을 사용할 때, 각자의 탭으로 설정된

공백 개수가 다른 혼란을 막기 위해 사용

• 줄 길이– 줄당 글자는 100자 이내– import, 커맨드 라인 명령어, URL 등은 예외p , 커맨 라인 명령어, 등은 예외

16Android Coding Convention by Suan Lee

Page 17: Android Coding Convention - Kangwon · 2016-06-02 · Android Coding Convention by Suan Lee 12. ... * Unless required by applicable law or agreed to in writing, software * distributed

Java 스타일 규칙Java 스타일 규칙타 규칙타 규칙

• 필드 이름– public, static 외에는 ‘m’으로 시작– static 필드는 ‘s’로 시작– 다른 필드는 소문자로 시작– public static final 필드는 모두 대문자로 시작하고, 단어p

사이는 ‘_’로 연결public class MyClass {

bli t ti fi l i t SOME CONSTANT 42public static final int SOME_CONSTANT = 42;public int publicField;private static MyClass sSingleton;int mPackagePrivate;

i t i t P i tprivate int mPrivate;protected int mProtected;

}

17Android Coding Convention by Suan Lee

Page 18: Android Coding Convention - Kangwon · 2016-06-02 · Android Coding Convention by Suan Lee 12. ... * Unless required by applicable law or agreed to in writing, software * distributed

Java 스타일 규칙Java 스타일 규칙타 규칙타 규칙

• 중괄호class MyClass {

int func() {if (something) {

//// ...} else if (somethingElse) {

// ...} else {

//// ...}

}}

• 조건문 중괄호if (condition) {if (condition) {

body; // ok}if (condition) body; // ok

18Android Coding Convention by Suan Lee

Page 19: Android Coding Convention - Kangwon · 2016-06-02 · Android Coding Convention by Suan Lee 12. ... * Unless required by applicable law or agreed to in writing, software * distributed

Java 스타일 규칙Java 스타일 규칙타 규칙타 규칙

• Annotation– 안드로이드 표준은 Java 1.5에서 미리 정의한 annotation

사용– 다른 modifier보다 먼저 위치, 같은 줄에 둠– 여러 개의 annotation이 있거나 인수화된 경우, 알파벳 순

서로 하나에 한 줄씩 위치

좋은 예 나쁜 예

XmlHttpRequest XMLHTTPRequest

getCustomerId getCustomerID

19Android Coding Convention by Suan Lee

Page 20: Android Coding Convention - Kangwon · 2016-06-02 · Android Coding Convention by Suan Lee 12. ... * Unless required by applicable law or agreed to in writing, software * distributed

Java 스타일 규칙Java 스타일 규칙타 규칙타 규칙

• ‘TODO’ 스타일– 임시 코드나 단기적인 해결책, 충분하지 않은 코드는

TODO 주석 사용– TODO의 미래 할일을 기록할 경우, 특정 날짜나 이벤트에

대해 기술

• 일관성 유지– 모든 코드에 일관성을 유지– 다른 사람과 다른 코드 스타일은 개성이 아니라 단점

20Android Coding Convention by Suan Lee

Page 21: Android Coding Convention - Kangwon · 2016-06-02 · Android Coding Convention by Suan Lee 12. ... * Unless required by applicable law or agreed to in writing, software * distributed

Java 스타일 규칙Java 스타일 규칙타 규칙타 규칙

• 로깅– 안드로이드의 5단계 로그 레벨

• ERROR: 치명적인 상황이 발생했을 경우• WARNING: 심각하고 예상치 못한 상황이 발생한 경우• INFOMATIVE: 대부분의 사람들이 관심 가질 만한 상황• DEBUG: 디바이스에서 예상치 못한 동작 조사와 디버깅 관련• DEBUG: 디바이스에서 예상치 못한 동작 조사와 디버깅 관련• VERBOSE: 위 4개의 상황 외에서 사용

21Android Coding Convention by Suan Lee

Page 22: Android Coding Convention - Kangwon · 2016-06-02 · Android Coding Convention by Suan Lee 12. ... * Unless required by applicable law or agreed to in writing, software * distributed

Java 스타일 규칙Java 스타일 규칙타 규칙타 규칙

• 테스트 메소드 이름 명명법– ‘_’를 이용해 어떤 테스트 케이스와 어떤 것이 테스트 될

것인지 분리

void testIsDistinguishable_protanopia() {ColorMatcher colorMatcher = new ColorMatcher(PROTANOPIA)assertFalse(colorMatcher.isDistinguishable(Color.RED, Color.BLACK))

tT ( l M t h i Di ti i h bl (C l X C l Y))assertTrue(colorMatcher.isDistinguishable(Color.X, Color.Y))}

22Android Coding Convention by Suan Lee

Page 23: Android Coding Convention - Kangwon · 2016-06-02 · Android Coding Convention by Suan Lee 12. ... * Unless required by applicable law or agreed to in writing, software * distributed

이클립스에서 안드로이드 포맷팅 적용이클립스에서 안드로이드 포맷팅 적용이 에서 이 맷팅 적용이 에서 이 맷팅 적용

• 안드로이드 포맷팅– ./development/ide/eclipse/android-formatting.xml

23Android Coding Convention by Suan Lee