2009-07-15 1 views
5

는 사용자 메소드의 구현을 필요로 이야기 한이 상상 :Agile 시나리오가 맞습니까?

public static void MyMethod(string paramA); 

여러 클래스가이 방법을 사용하는 것, 그리고 MyMethod라는 사용자 스토리 1을 완료하는 데 필요한 모든 것을,하지만 아무것도 더 많은 작업을 수행합니다.

당신은 또 다른 이야기 (사용자 스토리 2) 반복 미래에 될 방법을 필요로하는 함께 올 것을 확신하다 : MyMethod라는에

public static void MyMethod(string paramA, int paramB); 

이전 호출 리팩토링해야하며, MyMethod에 대한 몇 가지 새로운 호출은 사용자 스토리 2의 요구 사항을 충족시키기 위해 추가되어야합니다 (이야기 2 이후에는 paramA 만 사용하여 MyMethod를 호출하는 것이 좋습니다).

1) 만 구현 :

사용자 스토리 (1) 작업 은 애자 생각 공공 무효 MyMethod라는 (문자열 paramA를);

2) 구현 공용 MyMethod라는 공극 (문자열 paramA, INT의 paramB)를; - 그러나 지금은 두 번째 매개 변수를 사용하지 마십시오. 이 시점에서 호출은 두 번째 매개 변수에 0을 전달합니다.

3) 구현 공용 MyMethod라는 공극 (문자열 paramA, INT의 paramB)를; - 그러나 지금은 두 번째 매개 변수를 사용하지 마십시오. 전화가 올바른 값으로 전달됩니다 (사용자 스토리 2의 예상에 따라)

4) 구현 : public void MyMethod (string paramA, int paramB); - 그리고 모든 호출은 사용자 스토리 1과 2를 완전히 포함합니다.

답변

2

스펙트럼의 한쪽 끝에는 리팩토링으로 모든 것을 수행 할 수 있다고 주장하는 민첩 주의자가 있습니다. 다른 한편으로는 구식의 빅 디자인 - 프론트 (Big-Design-Up-Front) 군중이 있습니다. 먼저 전체 아키텍처를 구축하고 기능을 스냅해야한다고 생각합니다. 귀하의 질문은 귀하가 자신의 프로세스를 어리석게 따를 경우 두 철학의 실패를 드러내 기 때문에 완벽합니다. 원하는 것은 최대 효율입니다. 따라서 상황 1과 스토리 2가 무엇인지 분석해야합니다. S2없이 소프트웨어를 제공 할 수 있습니까? 아니면 평가 및 계획을 돕기 위해 스토리를 분할 했습니까? S1이 "장바구니에 추가"이고 S2가 "체크 아웃"인 경우 소프트웨어가 없으면 쓸모가 없으므로 S2를 지원하는 인터페이스를 만들지 않는 것은 바보입니다. 모든 프로젝트에는 소프트웨어를 배송 할 가치가있는 "Have-to-have"기능이 있습니다. 이야기의 양쪽 모두가 그 세트로부터 나온 것이라면, 지금 인터페이스를 빌드하여 나중에 리팩토링하는 데 낭비하지 말고 (# 3).

일반적으로 S1과 S2가 모두 필수 집합에 있으면 백 로그에서 서로 가깝게됩니다. 이것이 사실이 아니라면 엄청난 양의 필수 아이템을 보유하고 있으며 애자일 기술을 사용하여 프로젝트가 많은 이점을 얻지 못하거나 S2가 반드시 필요한 것은 아닙니다. 그래서 S1과 S2에 대한 약속 사이를 지나는 데 많은 시간 (몇 달)이 걸릴 것으로 예상된다면, 나는 1 매개 변수 인터페이스로 갈 것입니다. 시간은 항상 불확실성에 커다란 공헌자입니다.

+0

나는 네가 많이 대답하는 것을 좋아한다. 내가 말할 수있는 유일한 것은 S1이 interation 1에 있고 S2가 iteration 2에 있다는 것입니다. 나는 모든 반복 끝에 항상 배송 가능한 제품을 가져야한다고 믿습니다. 이제 : 한 번 반복 한 후에는 비즈니스가 proudct를 배송하는 것이 행복하지는 않지만 QA를 거쳐 잘 테스트받을 수 있습니다.그렇다면 효율성을 목표로하고 지금해야합니까 (요구 사항 및/또는 설계가 변경 될 수 있으므로 약간의 기회가있을 수 있습니다) 또는 반복 1에 필요한 것만 수행합니까? –

+0

또한 반복 1에 대해 '잘못된'일을하는 것을 믿지 않습니다. 스토리 2가 올 때 완전히 다시 디자인되어야하는 무언가를 구현하는 데는 아무런 포인트가 없습니다. 너 무슨 일이 일어날 지 안다면 미친 짓이야. 그러나 S1에서 여분의 마일을 가야 S2가 발생할 때 최소한의 작업을 할 수 있습니까? 또는 "예측은 매우 어렵습니다. 특히 미래에 관한 것"을 아는 것이 중요합니다. - Niels Bohr (덴마크 물리학 자). –

+0

나는 unsipable 제품을 만들기 위해 S1에서이 매개 변수에 사용되지 않은 매개 변수를 추가하는 것을 고려하지 않았습니다. 불필요하게 비대 해진다고 말할 수는 있지만 여전히 기능적입니다. 배송 전용이란 완료를 의미합니다. 테스트, 문서화, 빌드 및 설치가 가능합니다. – DancesWithBamboo

0

현대 개발 도구를 사용하면 두 번째 매개 변수를 갖는 메소드를 리팩터링하는 것이 매우 저렴합니다. 그래서 첫 번째 이야기를 구현하는 것이 가장 합리적인 것처럼 보이고 이후의 이야기에 관해서는 그 방법을 다시 방문하는 것처럼 보입니다.

그러나 ... 모든 좋은 질문처럼 대답은 실제로 "의존합니다". 어떤면에서 당신의 예는 토론에 대한 정의를하기에는 너무 사소합니다. 스토리 A가 "고객 이름 업데이트"이고 스토리 B가 일종의 트랜잭션 기능을 추가 한 경우 (어쩌면 paramB는 TX 컨텍스트 임) 어떻게 될까요? 어떤 경우에는 스토리에 약간의 작업이 필요할 수 있습니다. A는 B 없이는 어떤 실질적인 의미입니까? A가 오늘 아침에 구현되고 B가 오늘 오후에 구현되거나 다음 달에 B 작업이 수행됩니까?

+0

또는 B는 가능한 경우 기본값이있는 선택적 매개 변수입니다. – amischiefr

+0

예, 왜 옵션이 아닌지 이해할 수 없습니다. 함수의 끝에 확장 매개 변수가 표시되는 이유의 완벽한 예입니다. Java/C# 대 C++ 인수에 대해 잘 알고 싶지 않다. :) –

+0

이 시나리오에서는 선택적인 매개 변수가 아닙니다. 이 값을 가져 와서 사용자 스토리 2를 충족 시키도록 올바르게 설정해야합니다. 또한 언어 사용, 더 높은 수준의 민첩한 사고에 관한 토론이 아니길 바래요. –

1

순수 주의자는 옵션 1을 말할 것이다, 그러나 나는 상식을 듣고 줄 당신이 절대적으로이 그때 내가 당신의 디자인이 반영 거라고 요구 사항입니다 확신 100 % 인 경우.

애자 일은 또한 리팩토링을 기반으로하므로이 인터페이스를 공개적으로 공개하지 않는 한 변경하면 디자인에 영향을주지 않으므로 실제로 옵션 1을 사용하게됩니다.

+0

그래서 이것이 공개되지 않은 공개 API 인 경우 스토리 2 (또는 3, 4 ...)를 구현하는 것이 좋습니다. –

+0

그래, 개인적으로 그렇게 할거야. 공개 API가 릴리스 된 후에 업데이트하면 고통의 세계가됩니다. 물론, 당신은 API를 일반인에게 공개 할 이유가 무엇인지 스스로 고민해야합니다. – Duncan

12

그냥하십시오.

리팩토링은 쉽지 않습니다. 미래는 예측할 수 없습니다.

프로젝트

는 새로운 더 중요한 이야기는 2가 필요하지 않습니다 이야기를 의미 나타날 수, 통조림, 할 수있다, 그 때까지는 당신은 당신이 더 문제를 이해하고 모든 리팩토링해야 할 이야기 2에 도착. 당신이 필요로하지 않을 수없는 끝없는 이유가 있습니다.

+0

+1 YAGNI 접근은 – Jacob

+0

+1입니다. 야기. 이것은 극단적 인 예이지만 원리는 정확합니다. 이야기 2에서 리팩터링해야 할 수도있는 10 가지 방법이 있다면 어떨까요? –

1

"다릅니다." 당신이 대답하는 방법은 주로 팀을 훈련시키는 방법에 달려 있습니다.

설명하는 상황은 코드가 부풀어 오르는 미끄러운 경사쪽으로 라인을 가로 지르는 아주 작은 단계를 초대합니다. 계단이 너무 작아 경사를 알 수 없습니다. 안전 해요? 아마 그것은 사소한 예이기 때문일 것입니다. 많은 사람들이 "진행하는 것이 의미가 없으며 ..."사례가 더 크다. 그리고 스텝이 더 커질수록, 특히 스프린트 경계선을 넘어서는 경우, 추측 할 기회가 많아지고 낭비되는 작업과 여분의 사용되지 않는 코드로 끝납니다. 죽거나 미사용 코드를 많이 사용하는 시스템에서 작업하기.

코드가 부 풀리는 문제가있는 팀이라면 예상 디자인이없는 작은 조각으로 시스템을 구축하는 것과 같은 느낌이들 때까지 잠시 동안 "예상치 조절 노브를 설정"했습니다. . 시스템이 깨끗하게 진화한다는 것은 많은 개발자가 본 적이없는 것입니다. 그런 다음 결정을 다시 방문하십시오. 제가 작업 한 가장 생산적인 팀은 손잡이를 0으로 놓고 수년간 그런 식으로 유지했습니다.