如何在以下用例中减少样板代码

问题描述

在以下用例中利用可重用性的最佳解决方案是什么。 每当用户单击按钮时,我都试图通过使用以下功能清除字符串。 我尝试了很多方法,但没有找到任何可靠的解决方案。

private void clearFields(int i) {
    if (i == 0) {
        boardId = "";
        stateId = "";
        cityId = "";
        schoolId = "";
        classId = "";
        orientationId = "";
        studentTypeId = "";
    } else if (i == 1) {
        stateId = "";
        cityId = "";
        schoolId = "";
        classId = "";
        orientationId = "";
        studentTypeId = "";
    } else if (i == 2) {
        cityId = "";
        schoolId = "";
        classId = "";
        orientationId = "";
        studentTypeId = "";
    } else if (i == 3) {
        schoolId = "";
        classId = "";
        orientationId = "";
        studentTypeId = "";
    } else if (i == 4) {
        classId = "";
        orientationId = "";
        studentTypeId = "";
    } else if (i == 5) {
        orientationId = "";
        studentTypeId = "";
    } else if (i == 6) {
        studentTypeId = "";
    }
}

解决方法

我假设您真的想通过索引来做到这一点。如果是这样,那么我认为最干净和最简单的方法是使用不间断的开关。还有其他棘手的方法可以做到这一点,但我尽量避免“棘手”。

<?xml version="1.0" encoding="UTF-8"?><gupdate xmlns="http://www.google.com/update2/response" protocol="2.0" server="prod"><daystart elapsed_days="5296" elapsed_seconds="28389"/><app appid="mgndgikekgjfcpckkfioiadnlibdjbkf" status="error-unknownApplication"/><app appid="apbllhlpimnkljppmmdbiipfbjjimjgj" cohort="1::" cohortname="" status="ok"><updatecheck _esbAllowlist="false" status="noupdate"/></app></gupdate>

[编辑] 我们只有一个小的代码片段可以单独查看。我觉得我展示的代码是做你所要求的最干净的方法。话虽如此,很可能需要重新考虑整个设计,以便您根本不会以这种方式使用索引。话虽如此,我将第一个承认有时人们会在代码的某些角落走捷径,而我们有理由确信某个角落不会改变。

如果我强烈认为代码不需要维护,我至少有可能编写您拥有的精确代码。如果这个假设被证明是错误的,我总是可以稍后重构它。这就是为什么我说我假设你真的想做你所要求的。我们无法知道您的要求 - 因此我们无法知道“可维护性”问题会有多大。

除此之外,回过头来重构你自己的代码可能会教你更多关于干净设计的知识,而不是我能想到的任何东西......

,

我会小心减少样板代码。这是一个好主意,两个答案都很好。你需要考虑的是(因为你已经用软件设计标签标记了它):

  1. 这是实际代码吗?还是只是举例?如果是后者,您会发现重构代码要维护要困难得多。
  2. 如果你决定重构这个,我更喜欢@Chris Parker 提到的,特别是,“如果是这样,那么我认为最干净和最简单的方法是使用不中断的开关”。但这对于稍后处理它的人来说将是一场噩梦。在一定程度上避免这种情况的最好方法是使用 enum for switch\case。