[C] [Java]读取2D数组的行或列的函数的良好实践



我经常遇到我有很多例外和/或函数参数没有太大意义或可能导致错误的情况,如果程序员不确定确切知道错误功能如何工作。这是其中一种情况,所以我想我应该向堆栈寻求一些建议。

我有一个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 statements,并根据我要阅读一行还是列进行两个单独的案例。

第三个选项有点不错,但是由于我只想阅读一行,因此它允许使用该功能的人读取多个行,这可能会导致错误或意外行为。

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

那么,如何应对这类功能有什么想法?这个特定的例子当然没什么大不了的,但是当功能变大时,事情很容易变成意大利面。

谢谢!

使用所有三个功能!

// 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功能,读取原始2D数组的子阵列。

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

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

最新更新