문제

나는 복사하여 붙여넣기를 하고 있기 때문에 나쁜 프로그래머였습니다.예를 들어 데이터베이스에 연결하고 레코드 세트를 검색할 때마다 이전 코드를 복사하고 편집하고 DataGridview를 설정하는 코드를 복사하고 편집합니다.코드 재사용이라는 문구는 알고 있지만 실제로 사용한 적은 없습니다.데이터베이스 코드와 DataGridview 코드를 복사하여 붙여 넣을 필요가 없도록 코드 재사용을 어떻게 활용할 수 있습니까?,

도움이 되었습니까?

해결책

프로젝트의 규모에 따라 답을 변경할 수 있습니다.

a 더 작은 프로젝트 모든 DB 액세스를 수행하는 DatabaseHelper 클래스를 설정하는 것이 좋습니다. 연결 및 닫는 연결 및 DB 코드의 실행에 대한 래퍼 일뿐입니다. 그런 다음 더 높은 수준에서 실행될 DBCommands 만 쓸 수 있습니다.

비슷한 기술 ~할 수 있었다 더 큰 프로젝트에 사용되지만 몇 가지 추가 작업이 필요합니다. 인터페이스를 추가해야하며 DI, 데이터베이스에 대해 알아야 할 사항을 추상화해야합니다.

당신은 또한 orm, daab 또는 패턴 및 실습 그룹

OLE C & P를 방지하는 방법에 따라? - 코드를 작성할 때 코드가 비슷한 코드 블록이있는 경우 매개 변수 또는 2 개만 다르면 항상 자체 방법으로 리팩토링하기에 좋은 후보입니다.

이제 내 의사 코드 예제 :

Function GetCustomer(ID) as Customer
   Dim CMD as New DBCmd("SQL or Stored Proc")
   CMD.Paramaters.Add("CustID",DBType,Length).Value = ID
   Dim DHelper as New DatabaseHelper
   DR = DHelper.GetReader(CMD)
   Dim RtnCust as New Customer(Dx)
   Return RtnCust
End Function

Class DataHelper
  Public Function GetDataTable(cmd) as DataTable
    Write the DB access code stuff here.
    GetConnectionString
    OpenConnection
    Do DB Operation
    Close Connection
  End Function
  Public Function GetDataReader(cmd) as DataReader
  Public Function GetDataSet(cmd) as DataSet
  ... And So on ...
End Class

다른 팁

코드 재사용의 본질은 일반적인 작업을 수행하고 매개 변수화하여 다양한 입력을 수용 할 수 있습니다.

겸손하게하십시오 printf, 예를 들어. 당신이 가지고 있지 않았다면 상상해보십시오 printf, 그리고 만 가지고있었습니다 write, 또는 유사한 것 :

//convert theInt to a string and write it out.
char c[24];
itoa(theInt, c, 10);
puts(c);

이제 이것은 매번 글을 써야한다는 것을 짜증나게하고 실제로는 일종의 버기입니다. 그래서 일부 스마트 프로그래머는 자신이 이것에 지쳤다고 결정하고 더 나은 기능을 썼습니다.

printf("%d", theInt);

당신은 화려하게 될 필요가 없습니다 printf 다양한 인수와 형식 문자열이 있습니다. 다음과 같은 간단한 루틴조차도

void print_int(int theInt)
{
    char c[24];
    itoa(theInt, c, 10);
    puts(c);
}

닉하게 트릭을 할 것입니다. 이런 식으로, 당신이 바꾸고 싶다면 print_int 항상 stderr에 인쇄하려면 다음과 같이 업데이트 할 수 있습니다.

void print_int(int theInt)
{
    fprintf(stderr, "%d", theInt);
}

그리고 모든 정수는 이제 표준 오류로 마술처럼 인쇄됩니다.

그런 다음 해당 기능을 번들로 만들 수도 있고 다른 사람들은 라이브러리에 쓸 수 있습니다.이 기능은 프로그램에로드 할 수있는 코드 모음입니다.

코드 재사용 실습에 따라 연결할 데이터베이스가있는 이유는 다음과 같습니다. 누군가가 디스크에 레코드를 저장하기위한 코드를 만들고 다른 사람들이 사용할 수있을 때까지 재 작업하고 데이터베이스라고 부르기로 결정했습니다.

라이브러리는 마술처럼 나타나지 않습니다. 그들은 프로그래머에 의해 자신의 삶을 더 쉽게 만들고 더 빨리 일할 수 있도록 만들어졌습니다.

코드를 루틴에 넣고 해당 코드가 실행되기를 원할 때마다 루틴을 호출하십시오.

Martin Fowler 's를 확인하십시오 ~에 리팩토링, 중복 냄새가 나는 코드를 개선 할 수있는 방법을 알아 내기 위해 수많은 리팩토링 관련 인터넷 리소스 (StackoverFlow) 중 일부입니다.

처음에는 재사용 가능한 기능이있는 라이브러리를 만듭니다. 그들은 다른 응용 프로그램과 연결될 수 있습니다. 그것은 많은 시간을 절약하고 재사용을 장려합니다.

또한 라이브러리가 단위 테스트 및 문서화되어 있는지 확인하십시오. 따라서 올바른 클래스/기능/변수/상수를 찾는 것은 매우 쉽습니다.

좋은 규칙은 같은 조각을 세 번 사용하는 경우 절차/기능/라이브러리로 만드는 것보다 일반화하는 것이 분명히 가능합니다.

그러나 나이가 들어감에 따라 전문 개발자로서 더 많은 경험을 쌓기 때문에 두 가지 이유로 코드 재사용을 항상 최선의 아이디어로 보는 경향이 있습니다.

  1. 미래의 요구를 예상하기는 어렵 기 때문에 API를 정의하기가 매우 어렵 기 때문에 다음에 API를 실제로 사용할 수 있습니다. 두 번 더 많은 시간이 걸릴 수 있습니다. 일단 더 일반화되면 두 번째로 다시 작성할 것입니다. 특히 늦은 Java 프로젝트가 이것에 대한 경향이있는 것처럼 보이며, 그들은 프레임 워크 du Jour에 항상 다시 작성되는 것 같습니다.

  2. 더 큰 조직 (나는 하나의 구성원)에서, 일부 외부 팀 (사내 또는 제 3 자)에 의존 해야하는 경우 문제가 발생할 수 있습니다. 그러면 당신의 미래는 그들의 자금과 자원에 달려 있습니다. 따라서 외국 코드 나 라이브러리를 사용하는 것은 큰 부담 일 수 있습니다. 비슷한 방식으로 코드를 다른 팀에 공유하면 유지 관리를 유지할 것으로 기대할 수 있습니다.

그러나 이것들은 비즈니스 이유와 비슷하기 때문에 오픈 소스에서는 거의 재사용 할 수있는 좋은 일입니다.

코드 재사용을 얻으려면 마스터가되어야합니다.

  1. 본질을 포착하는 이름을 부여합니다. 이것은 정말로 정말로 중요합니다
  2. 그것이 한 가지만 수행하는지 확인합니다. 이것은 실제로 첫 번째 요점으로 돌아옵니다. 본질적으로 이름을 지정할 수 없다면 종종 너무 많은 일을합니다.
  3. 논리적 인 곳을 찾는 것. 다시 이것은 다시 한 번의 이름을 지정하고 본질을 포착 할 수있는 것으로 돌아온다 ...
  4. 중심 개념을 기반으로하는 것들로 그룹화합니다. 위와 동일하지만 다르지만 :-)

가장 먼저 주목해야 할 점은 복사하여 붙여넣기를 사용하면 가장 효율적인 방법은 아니지만 코드를 재사용한다는 것입니다.당신은 이전에 해결책을 생각해낸 상황을 인식했습니다.

코드 재사용을 고려할 때 알아야 할 두 가지 주요 범위가 있습니다.첫째, 프로젝트 내에서 코드를 재사용하고, 둘째, 프로젝트 간 코드를 재사용합니다.

프로젝트 내에서 복사하여 붙여넣을 수 있는 코드 조각이 있다는 사실은 현재 보고 있는 코드 조각이 다른 곳에서도 유용하다는 단서가 됩니다.이제 이를 함수로 만들고 프로젝트 내에서 사용할 수 있게 만들 차례입니다.이상적으로는 해당 코드의 모든 항목을 새 함수로 바꿔서 (a) 중복 코드를 줄이고 (b) 해당 코드 덩어리의 버그를 여러 함수가 아닌 하나의 함수에서만 수정하면 되도록 해야 합니다.

두 번째 범위인 프로젝트 간 코드 재사용은 최대한의 이점을 얻으려면 더 많은 조직이 필요합니다.이 문제는 몇 가지 다른 SO 질문에서 해결되었습니다. 여기 그리고 여기.

좋은 시작은 프로젝트 전체에서 재사용될 가능성이 있는 코드를 가능한 한 자체 포함된 소스 파일로 구성하는 것입니다.필요한 프로젝트별 지원 코드의 양을 최소화하면 새 프로젝트에서 전체 파일을 더 쉽게 재사용할 수 있습니다.이는 프로젝트별 데이터 유형의 사용을 최소화하고 프로젝트별 전역 변수 사용을 최소화하는 등을 의미합니다.

이는 사용자 환경에서 유용할 것으로 예상되는 기능이 포함된 유틸리티 파일을 생성하는 것을 의미할 수 있습니다.예.데이터베이스에 의존하는 프로젝트를 자주 개발하는 경우 공통 데이터베이스 기능입니다.

귀하의 문제에 답하는 가장 좋은 방법은 중요한 기능에 대한 별도의 어셈블리를 만드는 것입니다. 이런 방식으로 확장 메소드를 만들거나 도우미 조립 자체를 수정할 수 있습니다.이 기능을 생각하십시오.

ExportToExcel (목록 날짜, 문자열 파일 이름)

이 방법은 미래의 Excel Export 기능에 사용할 수 있으므로 자신의 도우미 어셈블리에 저장하지 않는 이유는 무엇입니까? 나는이 방법 으로이 어셈블리에 대한 참조를 추가합니다.

예를 들어, 적절한 솔루션은 블록을 붙여 넣을 때마다 편집 할 때마다 매개 변수로 취한 함수를 작성한 다음 해당 기능을 매개 변수로 호출하는 것입니다.

다른 사람들의 기능과 도서관을 사용하는 습관을 가지십시오.

일반적으로 특정 문제에는 잘 알려진 우아한 솔루션이 있음을 알 수 있습니다.

당신이 찾은 솔루션이 완벽하게 맞지 않더라도 다른 사람들이 어떻게 해결했는지를보고 문제에 대한 많은 통찰력을 얻게 될 것입니다.

나는 이것을 두 가지 수준으로 할 것이다. 먼저 클래스 또는 네임 스페이스 내에서 해당 범위에서 재사용 된 코드 조각을 별도의 방법으로 넣고 호출되는지 확인하십시오.

두 번째는 당신이 설명하는 경우와 비슷한 것입니다. 그것은 더 광범위하게 재사용 할 수있는 도서관이나 도우미/유틸리티 클래스에 넣는 좋은 후보입니다.

재사용을 위해 다른 사람이 제공 할 수 있는지 여부를 관점하여 수행하는 모든 것을 평가하는 것이 중요합니다. 이것은 우리 대부분이 깨닫지 못하는 프로그래밍에 대한 근본적인 접근법이어야합니다.

재사용해야 할 것은 더 자세히 문서화되어야합니다. 이름 지정 규칙은 별개의 것이며, 모든 매개 변수, 반환 결과 및 필요한 모든 제약/제한 사항/사전 조건은 명확하게 문서화되어야합니다 (코드 또는 도움말 파일).

사용중인 프로그래밍 언어에 다소 달려 있습니다. 대부분의 언어로 당신은 할 수 있습니다

  1. 변형을 허용하기 위해 함수를 작성하고 매개 변수화하십시오
  2. 다양한 데이터를 보유 할 멤버와 함께 함수 객체 작성
  3. 훨씬 더 복잡한 변형을 구현하는 (함수 객체?) 클래스의 계층 구조를 개발
  4. C ++에서는 컴파일 타임에 다양한 기능 또는 클래스를 생성하기 위해 템플릿을 개발할 수도 있습니다.

쉬운 : 카피 페이스트 코드를 잡을 때마다 꺼내십시오. 즉시 (즉, 이미 CP'D 코드를 여러 번 CP'D 후에 수행하지 마십시오) 새 기능으로 사용하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top