[C] [Java]读取二维数组的行或列的函数的良好实践?

时间:2017-04-28 12:12:40

标签: function methods

我经常遇到这样的情况:我有很多异常和/或函数参数没有多大意义,或者如果程序员不确切知道函数的工作原理会导致错误。这是其中一种情况,所以我想我应该向堆栈征求一些建议。

我有一个2D矩阵,我想创建一个读取行的一部分或列的一部分的函数。这很容易。我可以将它们分成两个函数,比如

readCol(int row, int startCol, int endCol) readRow(int col, int startRow, int endRow)

或者只是将所有内容保存在一个函数中,如

readLine(char 'axis', int start, int end)

readLine(int startRow, int endRow, int startCol, int endCol)

然而,这些似乎都不是最好的方法。

例如,第一个函数没有例外。只需循环阅读。但是,它们包含几乎完全相同的代码,唯一的区别是行和列被切换。

使用第二个选项,我得到的是我觉得“丑陋”的代码。我需要一个if语句,并根据我是否要读取行或列来制作两个单独的案例。

第三种选择有点好,但由于我只想阅读一行,它将允许使用该功能的人读取多行,这可能导致错误或意外行为。

也许这看起来像是挑剔,但如果有两件事我已经被告知编写好的代码,那就是让它尽可能地理解,并且在你不需要的时候不重复代码。我觉得所有这些功能都略微违反了这些规则。

那么,关于如何处理这些类型的功能的任何想法?这个特殊的例子当然不是什么大问题,但是当功能变大时,很容易变成意大利面。

谢谢!

1 个答案:

答案 0 :(得分:1)

使用所有三个功能!

// read one row
public double readRow( int row, int startCol, int endCol ) {
    readSubarray( row, row, startCol, endCol );
}

// read one column
public double readCol( int col, int startRow, int endRow ) {
    return readSubarray( startRow, endRow, col, col );
}

private double readSubarray( int startRow, int endRow, int startCol, int endCol ) {
    //...
}

制作两个readRowreadCol函数public,然后使用第三个private函数读取原始二维数组的子数组。

没有重复的代码;可读界面。模式是您的公共界面友好且具体,并且由私有的,更通用的功能支持。

注意:我假设您的开始/结束行/列变量是包容性的,并且您返回的内容类似于double - 上面的语言是Java-ish。