pip, virtualenv 설치

참고 : http://yong27.biohackers.net/373 , http://blog.naver.com/ez_/140138625021

easy_install은 다른 패키지 설치를 하다가 설치되어 버렸다.
easy_install을 이용해 pip과 virtualenv를 설치


claztec:site-packages claztec$ sudo easy_install pip
Password:
Searching for pip
Reading http://pypi.python.org/simple/pip/
Reading http://pip.openplans.org
Reading http://www.pip-installer.org
Best match: pip 1.0.2
Downloading http://pypi.python.org/packages/source/p/pip/pip-1.0.2.tar.gz#md5=47ec6ff3f6d962696fe08d4c8264ad49
Processing pip-1.0.2.tar.gz
Running pip-1.0.2/setup.py -q bdist_egg --dist-dir /tmp/easy_install-7gMJPa/pip-1.0.2/egg-dist-tmp-HW3PqS
warning: no files found matching '*.html' under directory 'docs'
warning: no previously-included files matching '*.txt' found under directory 'docs/_build'
no previously-included directories found matching 'docs/_build/_sources'
Adding pip 1.0.2 to easy-install.pth file
Installing pip script to /usr/local/bin
Installing pip-2.7 script to /usr/local/bin

Installed /Library/Python/2.7/site-packages/pip-1.0.2-py2.7.egg
Processing dependencies for pip
Finished processing dependencies for pip
claztec:site-packages claztec$ sudo pip
Usage: pip COMMAND [OPTIONS]

pip: error: You must give a command (use "pip help" to see a list of commands)
claztec:site-packages claztec$
claztec:site-packages claztec$
claztec:site-packages claztec$ sudo pip install virtualenv
Downloading/unpacking virtualenv
  Downloading virtualenv-1.7.tar.gz (2.1Mb): 2.1Mb downloaded
  Running setup.py egg_info for package virtualenv
   
    warning: no previously-included files matching '*.*' found under directory 'docs/_templates'
Installing collected packages: virtualenv
  Running setup.py install for virtualenv
   
    warning: no previously-included files matching '*.*' found under directory 'docs/_templates'
    Installing virtualenv script to /usr/local/bin
Successfully installed virtualenv
Cleaning up...
claztec:site-packages claztec$

저작자 표시 비영리 변경 금지

python 모듈 검색 경로

PYTHONPATH 환경 설정하기
bash 쉘 : export PYTHONPATH=~/mypythonlib

동적으로 바꾸기
import sys
sys.path.append('~/mypythonlib') 
저작자 표시 비영리 변경 금지

Bad Smells in Code

리팩토링
카테고리 컴퓨터/IT > 프로그래밍/언어
지은이 마틴 파울러 (대청미디어, 2002년)
상세보기


코드속 나쁜 냄새

refactoring (마틴 파울러)
http://refactoring.com/catalog/index.html

중복된 코드 (Duplicated Code)

클래스의 서로 다른 메소드 안에 같은 코드가 있을 경우

Extract Method(136)

동일한 수퍼클래스를 갖는 서브클래스에서 같은 코드가 나타나는 경우

Extract Method(136) 후에 Pull Up Method(370)

코드가 비슷하기는 하지만 같지 않다면

비슷한 부분과 서로다른 부분을 Extract Method(136)으로 분리
Form Template Method(393) 사용할 있는지 확인
만일 메소드가 같은 작업을 하지만 다른 알고리즘을 사용한다면 알고리즘 명확한 것을 선택해서 Substitute Algorithm(167) 사용

서로 관계가 없는 클래스에 중복된 코드가 있는 경우

한쪽 클래스에서 Extract Class(179) 사용한 다음 양쪽에서 새로운 클래스를 사용하도록

메소드 (Long Method)

대부분의 메소드의 길이를 줄이기 위한 방법

Extract Method(136)

메소드의 임시 변수를 제거하기 위해

Replace Temp with Query(147)

파라미터 리스트를 짧게 만들기 위해

Introduce Parameter Object(339), Preserve Whole Object(331)

위의 노력을 했지만 여전히 임시변수와 파라미터가 많다면

Replace Method with Method Object(163)

조건문과 루프

Decompose Conditional(276)


뽑아낼 코드 덩어리는 어떻게 찾을까?

주석을 찾아, 주석에 기반을 이름의 메소드로 바꿀 있다.

거대한 클래스 (Large Class)

클래스에 지나치게 많은 인스턴스 변수를 갖는 경우

Extract Class(179) 사용해 변수를 묶는다

위의 Extract class 이용해 새로 만든 클래스가 서브 클래스로서 의미가 있으면

Extract Subclass(378) 쉬운 선택이 있다.

클래스에 지나치게 많은 코드를 갖는 경우

Extract Class(179) Extract Subclass(378) 사용
Extract Interfact(389) 사용해 클래스를 사용하는 클라이언트가 해당 클래스를 어떻게 쓰게 것인지 결정

파라미터 리스트 (Long Parameter List)

이미 알고 있는 객체에 요청하여 파라미터의 데이터를 얻을 있으면 (특정 메소드를 이용해 값을 얻고, 값을 다른 메소드의 파라미터로 넘긴다면)

Replace Parameter with Method(335)

객체로 부터 주워 모은 데이터 뭉치를 객체 자체로 바꾸기 위해 (객체에서 값을 꺼내 파라미터를 넘기면 차라리 객체 자체를 파라미터로 사용하여라)

Preserve Whole Object(331)

객체와 관계 없는 여러 개의 데이터 아이템이 있으면

Introduce Parameter Object(339)


파라미터를 없애기 위해 객체를 만들면 dependency 생긴다.

dependency 없애려면 다시 데이터를 하나씩 풀어서 파라미터로 넘겨야 한다.

확산적 변경 (Divergent Change)

클래스가 다른 이유로 인해 다른 방법으로 자주 변경되는 경우 발생 (. 새로운 데이터베이스를 추가할 마다 세개의 메소드를 수정해야 한다.)

특정 원인에 대해 변해야 하는 것을 모두 찾은 다음, Extract Class(179) 사용하여 하나로 묶는다.

산탄총 수술 (Shotgun Surgery)

변경을 때마다 많은 클래스를 조금씩 수정해야 하는 경우

Move Method(170) Move Field(175) 사용하여 변경 부분을 하나의 클래스로 몰아 넣거나, 새롭게 만든다.
Inline Class(184) 만들어 하나로 모을 수도 있다.


확산적 변경과 산탄총 수술의 차이

확산적 변경은 여러 종류의 변경 때문에 하나의 클래스가 시달리는 경우고, 산탄총 수술은 하나를 변경할 많은 클래스를 고쳐야 하는 경우다.

기능에 대한 욕심 (Feature Envy)

클래스의 메소드가 자신이 속한 클래스 보다 다른 클래스의 데이터에 관심이 많은 경우

Move Method(170) 사용한다.

메소드의 특정 부분만 욕심이 많다면

욕심이 많은 부분을 Extract Method(136)으로 묶어서 Move Method(170)으로 적절한 위치로 옮긴다.

메소드가 여러 개의 클래스의 기능을 사용하는 경우

어떤 클래스에 있는 데이터를 가장 많이 사용하는가를 보고, 메소드를 클래스로 옮긴다.
Strategy
Visitor 패턴을 사용해 확산적 변경을 막는다. (인디렉션을 사용하여 오버라이드 되어야 하는 약간의 기능을 독립시킴으로 동작을 쉽게 변경할 있게 한다.)

데이터 덩어리 (Data Clumps)

두세 개의 클래스에 있는 필드나 시그니처에 있는 파라미터 등과 같은 데이터 아이템이 함께 몰려 다니는 경우

필드로 나타나는 덩어리를 찾아 Extract Class(179) 이용해 클래스로 만든다.
이후 Introduce Parameter Object(339) Preserve Whole Ojbect(331) 사용해 메소드의 시그니쳐를 변경하여 파라미터 리스트를 단순화 한다.

기본 타입에 대한 강박관념 (Primitive Obsession)

데이터를 기본타입이 아닌 레코드 타입(데이터를 구조화하여 의미있는 그룹으로 만듬) 이점을 살리기 위해

Data Value with Object(209) 사용한다.

데이터 값이 타입 코드이고, 값이 동작에 영향을 미치지 않으면

Replace Type Code with Class(255) 사용한다.

타입 코드에 의존하는 조건문이 있는 경우

Replace Type Code with Subclass(261) 또는 Replace Type Code with State/Strategy(265) 사용한다.

몰려 다녀야 하는 필드 그룹이 있다면

Extract Class(179) 사용한다.

파라미터 리스트에 기본타입을 사용한다면

Introduce Parameter Object(339) 사용한다.

배열을 쪼개서 쓰고 있다면

Replace Array with Object(220) 사용한다.

Switch (Switch Statements)

switch 문을 본다면 다형성을 생각하라

Extract Method(136) 사용해 switch문을 뽑아 Move Method(170) 사용하여 다형성이 필요한 클래스로 옮긴다.
시점에 Type Code with Subclasses(261) 사용할지, Replace Type Code with State/Strategy(265) 결정한다.
상속구조를 결정했으면 Replace Conditional with Polymorphism(293) 사용할 있다.

만일 하나의 메소드에만 영향을 미치는 미치는 개의 경우가 있다면

굳이 바꿀 필요가 없다. 이럴 경우 Replace Parameter with Explict Methods(327) 좋은 선택이다.

만일 조건 null 있는 경우가 있으면

Introduce Null Object(298) 사용한다.

평행 상속 구조 (Parallel Inheritance Hierarchies)

산탄총 수술의 특별한 경우. 클래스의 서브클래스를 만들면 다른 곳에도 모두 서브 클래스를 만들어 주어야 한다.

중복을 제거하기 위해

한쪽 상속 구조의 인스턴스가 다른 구조의 인스턴스를 참조하도록 만든다. Move Method(170) Move Field(175) 사용한다.

게으른 클래스 (Lazy Class)

충분한 일을 하지 않는 클래스는 삭제 되어야 한다.

별로 하는 일도 없는 클래스의 서브클래스가 있다면

Collapse Hierarchy(392) 사용하고

거의 필요 없는 클래스에 대해서는

Inline Class(184) 적용해야 한다.

추측성 일반화 (Speculative Generality)

언젠가 이런 종류의 일을 처리하기 위한 기능이 필요하다고 생각해 만든 기능에 대한 처리

별로 하는 일이 없는 추상 클래스가 있으면

Collapse Hierarchy(392) 사용한다.

불필요한 위임은

Inline Class(184) 제거한다.

메소드에 사용되지 않는 파라미터가 있다면

Remove Parameter(318) 적용한다.

메소드 이름이 이상하고, 추상적일 때는 Rename Method(313) 이용하여 구체적인 이름으로 바꾼다

임시 필드 (Temporary Field)

객체 안의 인스턴스 변수가 특정 상황에서만 세팅되는 경우. 사용되는지 이해하는건 매우 짜증나는 일이다.

불쌍한 고아 변수들을 위해

Extract Class(179) 사용한다. 그리고 변수를 사용하는 모든 코드를 새로 만든 클래스에 넣는다.

변수 값이 유효하지 않은 경우에 대한 대체 컴포넌트를 만들기 위해 (null 체크 코드를 없애는 대체 컴포넌트)

Introduce Null Object(298) 이용하여 조건문이 포함된 코드를 제거한다.

복잡한 알고리즘에서 여러 변수를 필요로 생기는 임시 필드는

필요한 변수와 메소드를 묶어 Extract Class(179) 만든다. 새로운 객체는 메소드 객체가 된다.

메시지 체인 (Message Chains)

메시지 체인은 어떤 객체를 얻기위해 다른 객체를 물어보고, 객체는 다시 다른 객체에 물어보고 하는게 반복 되는 경우를 말한다.

클라이언트가 클래스의 구조와 결합되어 있다는 것을 뜻하는데

Hide Delegate(187) 사용한다. 경우 종종 중간에 있는 모든 객체를 미들맨으로 만들 있다.

때로는 결과적으로 어떤 객체가 사용되는지를 보는것이 나을 있다.

그것을 사용하는 코드의 조각을 취해 Extract Method(136) 사용할 있는지 보고, 그리고 Move Method(170) 그것을 체인 밑으로 밀어 넣는다.
만약 체인 중에 있는 객체의 여러 클라이언트가 나머지 부분의 체인을 돌아다니고 싶어하면 이를 위한 메소드를 추가한다.

미들 (Middle Man)

클래스의 인터페이스를 보니 메소드의 태반이 다른 클래스로 위임하고 있을때

Remove Middle Man(191) 사용한다.

몇몇 메소드가 많은 일을 하지 않는다면

Inline Method(144) 사용하여 호출하는 곳에 코드를 삽입한다.

추가 동작이 있다면

Replace Delegation with Inheritance(404) 사용해 미들맨을 실제 객체의 서브 클래스로 바꾸고, 위임을 하나하나 따라갈 필요없이 기능을 확장한다

부적절한 친밀 (Inappropriate Intimacy)

지나치게 친밀한 클래스는 서로 떼어 놓아야 한다.

Move Method(170) Move Field(175) 사용하여 조각으로 나눈다.
Change Bidirectional Association to Unidirectional(236) 적용가능한지 본다

이들 클래스에 공통 관심사가 있다면

Extract Class(179) 사용해 공통 부분을 빼내 별도의 클래스로 만든다.
또는 Hide Delegate(187) 사용하여 다른 클래스가 중개하도록 한다.

상속을 받는 서브 클래스가 부모 클래스가 알려주는 보다 많은 것을 알려고 할때

Replace Inheritance with Delegation(401) 적용한다.

다른 인터페이스를 가진 대체 클래스 (Alternative Classes with Different Interfaces)

같은 작업을 하지만 다른 시그니처를 가지는 메소드에 대해

Rename Method(313) 사용한다.

이것 만으로 부족할때는 프로토콜이 같아질때까지

Move Method(170) 이용하여 동작을 이동한다.

너무 많은 코드를 옮겨야 경우

Extract Class(384) 사용할 있다.

불완전한 라이브러리 클래스 (Incomplete Library Class)

라이브러리 클래스가 가지고 있었으면 하는 메소드가 있다면

Introduce Foreign Method(194) 사용하고

별도의 동작이 잔뜩 있다면

Introduce Local Extension(196) 필요하다.

데이터 클래스 (Data Class)

필드와 필드에 대한 get/set 메소드만 가지고 다른 것은 아무것도 없는 클래스가 존재하면

이런 클래스의 필드가 public으로 존재한다면

Encapsulate Field(242) 적용한다.

컬렉션(Collection)필드를 가지고 있다면 적절히 캡슐화 되어 있는지 보고, 캡슐화가 되어 있지 않으면

Encapsulate Collection(244) 적용한다.

값이 변경되면 되는 필드는

Remove setting Method(344) 사용한다.

동작을 클래스로 옮기기 위해

Move Method(170) Extract Method(136) 사용한다

거부된 유산 (Refused Bequest)

서브클래스는 메소드와 데이터를 부모 클래스로 부터 상속 받는데, 만약 서브클래스가 주어진 상속을 원치 않거나 필요로 하지 않고 필요한 일부만 고를 경우

상속 구조가 잘못 되었다는 뜻이고, 새로운 형제 클래스를 만들고 Push Down Method(376) Push Down Field(377) 사용해 사용되지 않는
메소드를 모두 형제 메소드로 보낸다.-> 기존의 부모와 자식 클래스 관계를 형제 관계로 변경한다

서브클래스가 동작은 재사용하지만 슈퍼클래스의 인터페이스를 지원하는 것은 원치 않는다면 인터페이스를 거부하는 문제가 생긴다는 것이다

Replace Inheritance with Delegation(401) 적용해 해결한다.

주석 (Comments)

코드 블록이 무슨 작업을 하는지 설명하기 위해 주석이 필요하면

Extract Method(136) 시도해 본다.

메소드가 이미 추출되어 있는데도 여전히 코드가 하는 일에 대한 주석이 필요하면

Rename Method(313) 사용한다

시스템의 필요한 상태에 대한 규칙 같은 것을 설명할 필요가 있다면

Introduce Assertion(306) 사용한다.

저작자 표시 비영리 변경 금지
|  1  |  2  |  3  |  4  |  5  | ...  36  |