如何处理由联合程序员完成的尚未实现的方法?


45

这是关于团队合作的问题。

最近,我和一个由6人组成的团队一起从事了我的第一个较大的Java编程项目(约80个类),尽管我们中只有4个人正在不断地编写代码。我们分配了要尽早完成的工作,在某个时候,我需要调用一种方法,而该方法尚未由我的一个协同编程人员实现。推荐的处理方式是什么?

我看到的选项,尽管我真的不喜欢其中任何一个:

  1. 给自己写一个a //TODO并稍后重新查看此代码行,以检查该方法是否已在此期间实现。

  2. 要求相应的团队成员来实现这现在

  3. 抛出自定义runtimeException,其中包含尚未实现的内容的清晰描述。(至少我们不必花很长时间来找出丢失的内容)

  4. 将所需的方法添加到类中并将其写入//TODO消息正文中,还可能向他们发送有关该更改的快速消息。(现在,这不再是我的问题,但是如果他们与此同时正在使用此方法,那么这可能会导致令人讨厌的合并冲突)

  5. 在实际编写完成工作的代码之前,为所有内容定义抽象类或接口。(因为这些界面经常更改,所以效果不太好)


51
我认为工作流程中需要别人编写的方法是不正确的。您正在使用功能。如果该功能需要一种方法,则可以实现它。如果两个人要实现单一功能,那么他们要么配对,要么整合和交流如此频繁,以至于看起来就像他们配对。
欣快感

8
@Euphoric我曾多次遇到过这样的情况:要在相对较短的时间内开发出相当大的新功能,因此必须将用户界面,业务逻辑和API层划分为不同的任务,以便同时进行工作,否则,截止日期将永远无法实现。这正是在UI上工作的人应该只在BL处声明数据访问方法和命令作为接口,而让其他人在仅实现UI的情况下进行实现的工作。
安迪

15
@DavidPacker您描述的不是解决该问题的唯一方法。与每个人都在分开的零件上工作的水平切片相比,垂直切片,频繁集成,小的功能都是更好的解决方案。
欣快感,

3
@Euphoric我不能再同意你的看法。在可能的情况下,我们采用剥离非关键部件的复杂新功能的方式(即,那些只会改善用户体验但并不需要立即使用的部件)。令人遗憾的是,有时您提到的选项(既不剥离功能)也不可行。商业上说,开发商做。因此,尽管您的观点很明确,但也有可能有人会遇到这样的情况,即必须完成某种功能工作拆分才能满足业务需求。
安迪

2
怎么样他他想要怎样处理呢?
阿甘州'17

Answers:


5

这是一个有趣的问题,答案可能比您想象的要容易。

简而言之,编写测试以验证您的假设。无论您是执行实现还是其他程序员都没关系

长答案。

您列出的任何选项在某种程度上都是被动的,需要迟早返回并重新访问代码(如果有)。

  • 注释需要由负责实施的同行阅读和处理。在此期间,您的代码无法编译。如果您在代码存储库中检查这种状态,则持续集成管道将无法正常工作,而且这也是一种不好的做法…… 永远不要签入损坏的代码
  • 运行时异常似乎更好,但仍然有毒,因为您的同伴程序员可能会认为实现已经完成而没有检查,因此系统也处于不稳定状态。如果不经常触发该方法,则可能会导致生产代码损坏...做法也很糟糕... 永远不要签入“未实现”异常
  • 等待您的程序员对方法或存根的实现也很艰巨。它破坏了您的工作流程以及其他程序员的工作流程。如果他们生病了,在开会的时候,在喝咖啡休息时间,您想花时间等待吗?... 如果您不必等待某人
  • 实施缺失的方法绝对是前进的最佳方法。但是,如果您的实现不能满足整个用例,而您的程序员同伴需要修改或更改,会发生什么呢?您和他们如何确保它仍然与您的预期兼容?答案很容易。编写测试以验证,描述和记录您的意图。如果测试失败,很容易注意到。如果需要对该方法进行更改而破坏了您的功能...您会立即看到它。你们都有理由进行交流并决定要做什么。拆分功能?更改您的实现,等等... 切勿检入测试未充分记录的代码

为了达到足够的测试水平,我建议您看一下两个学科。

  1. TDD-测试驱动的开发-这将确保您描述意图并进行充分测试。它还使您可以模拟或伪造尚未实现的方法和类(也可以通过使用接口)。该代码和测试仍将编译,并允许您独立于其他程序员的代码来测试自己的代码。(请参阅:https : //en.wikipedia.org/wiki/Test-driven_development

  2. ATDD-接受测试驱动的开发-这将创建一个外部循环(围绕TDD循环),可帮助您整体测试功能。这些测试只有在实现了全部功能后才会变成绿色,从而在您的同事完成工作时为您提供自动指示器。如果你问我的话,很整洁。

警告:在您的情况下,我只会编写简单的验收测试,而不会尝试引入过多的业务方面,因为这从一开始就太多了。编写简单的集成测试,将功能所需的系统所有部分放在一起。这就是所需要的

这将使您可以将代码放入持续集成管道中,并产生高度可靠的实现。

如果您想进一步了解该主题,请查看以下链接:


103

要求存根。

或自己写。无论哪种方式,您和您的同事都需要就界面及其使用意图达成一致。该协议需要相对巩固,以便您可以针对存根进行开发-更不用说了,因此您可以为单元测试创​​建自己的模拟...


25
^^这个。如果您正确使用了接口,那么在另一个人完成编写接口之前,就不需要实现。
罗伯特·哈维

13
进而请罗伯特(Robert)发表评论,如果您在专为多人
共享

1
Java没有头文件真是可惜。在C / C ++世界中,您可以制定API并首先编写所有标头,然后缺少实现会成为链接器的问题。(略微简化,ABI也需要保持不变,这只是一个链接问题)。
Wes Toleman '12

16
@WesToleman有趣的是,关于Java我最喜欢的事情之一是它没有头文件。罗伯特和科西卡提到的“接口”完美地填补了这一角色。您首先要制定API,编写接口,而缺少具体的实现对于编译器来说不是问题。
GrandOpener

1
@WesToleman这对您来说很好吗?在我看来,这听起来很像瀑布式的地狱,而我的猜测是,当您意识到自己错过了这个“重要参数”时,就不得不进一步更新界面了吗?
netigger

6

在您的情况下,我会与负责该职能的团队成员交谈。他们可能可以优先考虑该功能的开发,因此您可以早日开始使用它。

我会避免您的第四个选择。您已经编写了所有代码,正如您所说,您不再认为这是您的问题。然后,您的同事编写该函数的实现,而不再认为这是他们的问题。谁真正在测试您编写的代码是否正常工作?


您应要求该功能的API,该API应产生一个或多个接口。最好一起使用,因为您将需要使用此界面,以便您可以根据输入来设计初始测试用例。然后实际的实现可以晚一点(包括可能的API变更)
托尔比约恩Ravn的安徒生
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.