我经常遇到我有很多例外和/或函数参数没有太大意义或可能导致错误的情况,如果程序员不确定确切知道错误功能如何工作。这是其中一种情况,所以我想我应该向堆栈寻求一些建议。
我有一个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 ) {
//...
}
使两个readRow
和readCol
功能public
,然后具有第三个private
功能,读取原始2D数组的子阵列。
无重复代码;可读界面。模式是您的公共界面友好且具体,并得到私人,更通用的功能的支持。
注意:我假设您的开始/结束行/col变量包含在内,并且您正在返回类似double
的内容 - 上面的语言是Java -ish。