我经常遇到这样的情况:我有很多异常和/或函数参数没有多大意义,或者如果程序员不确切知道函数的工作原理会导致错误。这是其中一种情况,所以我想我应该向堆栈征求一些建议。
我有一个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语句,并根据我是否要读取行或列来制作两个单独的案例。
第三种选择有点好,但由于我只想阅读一行,它将允许使用该功能的人读取多行,这可能导致错误或意外行为。
也许这看起来像是挑剔,但如果有两件事我已经被告知编写好的代码,那就是让它尽可能地理解,并且在你不需要的时候不重复代码。我觉得所有这些功能都略微违反了这些规则。
那么,关于如何处理这些类型的功能的任何想法?这个特殊的例子当然不是什么大问题,但是当功能变大时,很容易变成意大利面。
谢谢!
答案 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 ) {
//...
}
制作两个readRow
和readCol
函数public
,然后使用第三个private
函数读取原始二维数组的子数组。
没有重复的代码;可读界面。模式是您的公共界面友好且具体,并且由私有的,更通用的功能支持。
注意:我假设您的开始/结束行/列变量是包容性的,并且您返回的内容类似于double
- 上面的语言是Java-ish。