마감 기한에 도달 한 후 더 이상 사용되지 않는 코드가 컴파일되지 않도록 방지 [닫기] 큰 모 놀리 식 프로젝트 (전체 클래스,

우리 팀에서 우리는 큰 모 놀리 식 프로젝트 (전체 클래스, 메소드 등)에서 많은 오래된 물건을 청소했습니다.

그 청소 작업 동안 나는 평소보다 어떤 종류의 주석이나 라이브러리가 더 멋진 지 궁금했다 @Deprecated. 이것은 @FancyDeprecated특정 날짜가 경과 한 후 기존 사용되지 않는 코드를 청소하지 않은 경우 성공하는 프로젝트의 빌드를 방지해야한다.

인터넷에서 검색했지만 아래 설명 된 기능을 가진 항목을 찾지 못했습니다.

  • 특정 날짜 이전에 삭제하려는 주석에 주석 또는 이와 유사한 것이어야합니다.
  • 그 날짜 전에 코드가 컴파일되고 모든 것이 정상적으로 작동합니다.
  • 이 날짜 이후에는 코드가 컴파일되지 않으며 문제에 대한 경고 메시지가 표시됩니다.

유니콘을 찾고 있다고 생각합니다. 어떤 프로그램 언어에도 비슷한 기술이 있습니까?

계획 BI는 “마감일”에 실패하기 시작하여 제거 될 코드의 단위 테스트로 마술을 만들 가능성을 생각하고 있습니다. 이것에 대해 어떻게 생각하십니까? 더 좋은 아이디어?



답변

이것이 컴파일을 실제로 금지 할 때 유용한 기능이라고 생각하지 않습니다. 2018 년 1 월 6 일에 전날 컴파일 된 코드의 많은 부분이 컴파일되지 않으면 팀에서 해당 주석을 신속하게 다시 제거하거나 코드를 정리했는지 여부를 결정합니다.

그러나 코드에 사용자 정의 주석을 추가 할 수 있습니다

@Deprecated_after_2018_07_31

이러한 주석을 스캔 할 수있는 작은 도구를 만듭니다. (리플렉션을 사용하지 않으려는 경우 grep의 간단한 라이너 하나만 사용하면됩니다.) Java 이외의 다른 언어에서는 “grepping”에 적합한 표준화 된 주석 또는 전 처리기 정의를 사용할 수 있습니다.

그런 다음 특정 날짜 직전 또는 직후에 해당 도구를 실행하고 여전히 해당 주석을 찾으면 해당 코드 부분을 긴급하게 정리하도록 팀에 상기 시키십시오.


답변

이것은 시한 폭탄으로 알려진 기능을 구성합니다 . 시간 폭탄을 만들지 마십시오.

코드는 아무리 잘 구조화하고 문서화 하더라도 특정 연령 이상으로 살면 이해하기 어려운 신화적인 블랙 박스로 바뀔 입니다. 미래에 누군가가 필요로하는 마지막 일은 또 다른 이상한 실패 모드이며, 가능한 최악의 시간에, 그리고 명백한 해결책없이 완전히 놀라게합니다. 이러한 문제를 의도적으로 생성 한 데 대한 변명의 여지는 없습니다.

이 방법을 살펴보십시오. 노후화를 염두에두고 코드를 따라갈 수있을 정도로 코드 기반을 체계화하고 인식하고 있다면 코드 내에 메커니즘이 필요하지 않습니다 . 그렇지 않으면 코드베이스의 다른 측면에 대한 최신 정보가 없을 수도 있고 알람에 적시에 정확하게 응답하지 못할 수도 있습니다. 즉, 시한 폭탄은 누구에게도 좋은 목적을 제공하지 않습니다. 그냥 아니라고 말해!


답변

C #에서는 ObsoleteAttribute다음과 같은 방식으로 사용합니다 .

  • 버전 1에서는 기능이 제공됩니다. 방법, 클래스 등
  • 버전 2에서는 원래 기능을 대체하기 위해 더 나은 기능을 제공합니다. 기능에 사용되지 않는 속성을 배치하고 “경고”로 설정 한 후 “이 기능은 더 이상 사용되지 않습니다. 대신 더 나은 기능을 사용하십시오.이 라이브러리의 버전 3에서는 이러한 기능이 릴리스됩니다. 날짜,이 기능을 사용하면 오류가 발생합니다. ” 이제 기능 사용자는 여전히 기능을 사용할 수 있지만 새 기능을 사용하려면 코드를 업데이트해야합니다.
  • 버전 3에서는 속성을 경고가 아닌 오류로 업데이트하고 “이 기능은 더 이상 사용되지 않습니다. 대신 더 나은 기능을 사용하십시오.이 라이브러리의 버전 4에서는 다음과 같이 릴리스됩니다. 날짜가되면이 기능이 실행됩니다. ” 이전 경고에주의를 기울이지 않은 사용자에게는 여전히 문제를 해결하는 방법을 알려주는 유용한 메시지가 표시되며 이제 코드가 컴파일되지 않으므로 문제를 해결해야합니다.
  • 버전 4에서는 치명적인 예외가 발생하도록 기능을 변경하고 다음 버전에서 기능이 완전히 제거 될 것이라는 메시지를 변경합니다.
  • 버전 5에서는 기능을 완전히 제거하고 사용자가 불만을 표시하는 경우 세 가지 릴리스주기의 공정한 경고를 제공했으며, 사용자가 강하게 느끼면 버전 2를 계속 사용할 수 있습니다.

여기서의 아이디어는 영향을받는 사용자가 가능한 한 크게 고통을 겪지 않고 적어도 하나의 라이브러리 버전에서이 기능을 계속 사용할 수 있도록하는 것입니다.


답변

“더 이상 사용되지 않음”의 의미를 잘못 이해했습니다. 더 이상 사용되지 않는 방법 :

일반적으로 대체 되었기 때문에 사용 가능하지만 더 이상 사용하지 않는 것이 가장 좋습니다.

옥스포드 사전

더 이상 사용되지 않는 기능은 여전히 ​​컴파일됩니다.

특정 날짜에 기능 을 제거하려고 합니다. 괜찮아. 그렇게하는 방법은 해당 날짜에 제거하는 것입니다 .

그때까지는 더 이상 사용되지 않거나 사용되지 않거나 프로그래밍 언어에서 호출하는 것으로 표시하십시오. 메시지에 제거 할 날짜와이를 대체하는 날짜를 포함하십시오. 다른 개발자가 새로운 사용을 피하고 가능하면 오래된 사용을 대체해야한다는 경고가 표시됩니다. 이러한 개발자는이를 준수하거나 무시할 것이며 누군가 제거 될 때 그 결과를 처리해야합니다. (상황에 따라 본인이거나 본인이 사용하는 개발자 일 수 있습니다.)


답변

이미 출시 된 소프트웨어 버전을 지원하려면 이전 버전의 코드를 빌드하고 디버깅하는 기능을 유지해야합니다. 특정 날짜 이후 빌드를 방해하면 향후 합법적 인 유지 관리 및 지원 작업을 수행하지 못하게 될 위험이 있습니다.

또한 컴파일하기 전에 1 ~ 2 년 내 컴퓨터의 시계를 다시 설정하는 것은 간단한 해결 방법처럼 보입니다.

“더 이상 사용되지 않음”은 앞으로 무언가가 사라질 것이라는 경고입니다. 사람들이 해당 API를 사용하지 못하게 하려면 관련 코드를 제거하십시오 . 어떤 메커니즘으로 코드를 사용할 수 없게 만들면 코드베이스에 코드를 남겨 둘 필요가 없습니다. 코드를 제거하면 찾고있는 컴파일 타임 검사가 제공되며 사소한 해결 방법이 없습니다.

편집 : 귀하의 질문에 “사용하지 않은 오래된 코드”를 참조하십시오. 코드가 실제로 사용되지 않으면 더 이상 사용되지 않을 것입니다. 그냥 삭제하십시오.


답변

나는 전에 그런 기능을 본 적이 없다-특정 날짜 이후에 효력을 발휘하는 주석.

@Deprecated하지만, 충분한 수있다. CI에서 경고를 포착하고 존재하는 경우 빌드 수락을 거부합니다. 이는 컴파일러에서 빌드 파이프 라인으로 책임을 이동하지만 추가 단계를 추가하여 빌드 파이프 라인을 (반) 쉽게 변경할 수 있다는 이점이 있습니다.

이 답변 문제를 완전히 해결 하지는 못합니다 (예를 들어 경고가 있지만 개발자 컴퓨터의 로컬 빌드는 여전히 성공할 것임). CI 파이프 라인이 설정되어 실행중인 것으로 가정합니다.


답변

캘린더 나 할 일 목록을 찾고 있습니다.

또 다른 대안은 코드베이스에 경고가 거의없는 경우 사용자 정의 컴파일러 경고 또는 컴파일러 메시지를 사용하는 것입니다. 경고가 너무 많으면 추가 작업 (약 15 분)을 소비 하고 각 빌드에서 지속적 통합이 제공 하는 빌드 보고서에서 컴파일러 경고를 선택해야합니다 .

코드를 수정해야한다는 점을 기억하십시오. 때때로 이러한 알림에는 실제 마감일이 엄격하기 때문에 타이머를 설정해야 할 수도 있습니다.

목표는 사람들에게 문제가 존재하고 주어진 시간 프레임을 사용하여 수정해야 함을 지속적으로 상기시키는 것입니다. 특정 시간에 빌드를 중단시키는 기능은 아닙니다. 그러나 그 기능 자체는 주어진 기간으로 고정됩니다.