CollectionBase에서 상속받은 클래스에서 제네릭으로 리팩터링하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/98426

문제

저는 약 250,000줄의 코드로 구성된 애플리케이션을 작업하고 있습니다.저는 현재 원래 .NET 1.1로 구축된 이 응용 프로그램을 작업하는 유일한 개발자입니다.전체에 걸쳐 널리 사용되는 클래스는 CollectionBase에서 상속됩니다.모든 데이터베이스 컬렉션은 이 클래스에서 상속됩니다.대신 일반 컬렉션 목록에서 상속하기 위해 리팩토링을 고려하고 있습니다.말할 필요도 없이 Martin Fowler의 Refactoring 책에는 제안 사항이 없습니다.이 리팩터링을 시도해야 합니까?그렇다면 이 리팩토링을 해결하는 가장 좋은 방법은 무엇입니까?

그리고 그렇습니다. 전체적으로 단위 테스트가 있지만 QA 팀은 없습니다.

도움이 되었습니까?

해결책

250,000줄은 리팩터링할 부분이 많으며 다음 중 몇 가지 사항을 고려해야 합니다.

  1. 리팩토링된 코드를 QA할 수 있는 QA 부서가 있나요?
  2. 이전 코드에 대한 단위 테스트가 있나요?
  3. 프로젝트와 관련된 일정이 있습니까?사용자가 버그를 발견할 때 코드를 유지하고 있습니까?

1번과 2번 아니오라고 대답하셨다면 저는 무엇보다도 기존 코드에 대한 단위 테스트를 작성하겠습니다.광범위하고 철저하게 만드십시오.해당 사항이 준비되면 버전을 분기하고 리팩토링을 시작하세요.단위 테스트는 제네릭을 올바르게 리팩토링하는 데 도움이 될 수 있습니다.

2가 '예'이면 해당 단위 테스트에 의존하여 분기하고 리팩토링을 시작합니다.

QA 부서도 테스트할 새 코드를 현장에 제출할 수 있으므로 많은 도움이 될 것입니다.

마지막으로 클라이언트/사용자에게 버그 수정이 필요한 경우 먼저 수정하세요.

다른 팁

하지 않다.이 연습을 통해 코드 기반을 배치하는 데 대한 정말 좋은 비즈니스 근거가 없다면 말이죠.리팩터링을 통해 창출되는 비용 절감 또는 수익은 무엇입니까?내가 당신의 매니저라면 아마도 반대하라고 조언할 것입니다.죄송합니다.

CollectionBase는 상속된 클래스에서 어떻게 노출되나요?
Generics가 CollectionBase보다 더 잘할 수 있는 것이 있습니까?

이 클래스는 많이 사용되지만 하나의 클래스일 뿐입니다.리팩토링의 핵심은 프로그램의 현상 유지를 방해하지 않는 것입니다.클래스는 항상 외부 세계와의 계약을 유지해야 합니다.이렇게 할 수 있다면 리팩토링하는 코드는 25만 줄이 아니라 아마도 2,500줄에 불과할 것입니다(무작위 추측이지만 이 클래스가 얼마나 큰지는 모르겠습니다).

그러나 이 클래스에서 노출이 많이 발생하는 경우 대신 해당 노출을 계약으로 처리하고 노출을 제외해야 할 수도 있습니다.

만약 너라면 ~이다 계속할 테니 사용하지 마세요 목록< T >.대신에 System.Collections.ObjectModel.컬렉션< T >, 이는 CollectionBase의 정신적 후계자에 가깝습니다.

그만큼 Collection<T> 클래스는 항목을 추가 및 제거하거나, 컬렉션을 지우거나, 기존 항목의 값을 설정할 때 동작을 사용자 지정하는 데 사용할 수 있는 보호된 메서드를 제공합니다.당신이 사용하는 경우 List<T> 재정의할 방법이 없습니다. Add() 누군가가 컬렉션에 광고를 표시할 때 처리하는 방법입니다.

코드를 리팩토링하고 최신 상태로 유지하는 것은 코드 부패/냄새를 방지하는 데 매우 중요한 프로세스라고 생각합니다.많은 개발자들이 자신의 코드에 집착하거나 단위 테스트에 자신감이 없어서 문제를 해결하고 정리하여 제대로 수행할 수 없어 어려움을 겪습니다.

시간을 내어 정리하고 코드를 개선하지 않으면 장기적으로 후회하게 될 것입니다. 왜냐하면 앞으로 수년 동안 해당 코드를 유지 관리해야 하기 때문입니다. 그렇지 않으면 코드를 넘겨받는 사람이 누구든 당신을 미워할 것입니다.단위 테스트가 있고 코드를 리팩터링할 때 여전히 작동하는지 확인하기 위해 해당 테스트를 신뢰할 수 있어야 한다고 말씀하셨습니다.

그래서 나는 하라고 말하고, 청소하고, 아름답게 만드세요.단위 테스트가 리팩터링을 처리할 수 있는지 확신할 수 없다면 몇 가지를 더 작성하세요.

나는 토마스의 말에 동의한다.

리팩토링이 "내 시간과 다른 일을함으로써 무엇을 얻는가?" 대답은 유지 관리 가능성을 높이는 것에서부터 더 나은 성능에 이르기까지 많은 일이 될 수 있지만 항상 다른 것을 희생 시키면됩니다.

코드를 보지 않고는 말하기 어렵지만 리팩토링하기에는 매우 나쁜 상황처럼 들립니다.테스트는 훌륭하지만 완벽하지는 않습니다.그 중 하나가 잘못된 가정을 갖게 되면 리팩터링으로 인해 불쾌한 버그가 발생할 수 있습니다.그리고 그것을 포착할 QA가 없다면 그것은 좋지 않을 것입니다.

나는 또한 개인적으로 이와 같은 대규모 리팩터링에 대해 약간 불안합니다.한 번 일자리를 구해 보세요.그것은 정부 밖에서 나의 첫 번째 직업이었고(조금 더 관대한 경향이 있으며 일단 '임기'를 얻으면 해고되기가 엄청나게 어렵습니다) 그리고 저는 유일한 웹 프로그래머였습니다.제대로 작성되지 않은 레거시 ASP 앱을 무릎 위에 떨어뜨렸습니다.나의 첫 번째 우선순위는 그 빌어먹을 일을 덜... 이상한 것으로 리팩토링하는 것이었습니다.내 고용주는 불을 끄는 것 외에는 아무것도 원하지 않았습니다.6개월 후 저는 다시 일자리를 찾고 있었습니다. p 이 이야기의 교훈:이 작업을 시작하기 전에 먼저 관리자에게 확인하십시오.

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