有一个 void 方法,在它的主体中:
- 对第一次出现的二进制搜索
- 最后一次出现的二进制搜索
- 将所有索引写入字符串并输出到控制台的循环
感觉方法太重了:(
问题:创建方法有没有好的礼仪?例如,我可以制作 3 种方法而不是 1 种:
- int 第一次出现
- int 最后一次出现
- 带索引的字符串循环
它会更加简洁,但是方法的数量从 1 增加到 3。
一个大方法是否应该总是分解成更简单的方法?
还是纯粹是个人喜好问题,这里没有礼貌?
多合一方法
void IndexFinderArrayBS(int number, int[] array)
{
int low = 0;
int high = array.Length - 1;
int resultfirst = -1;
int resultlast = -1;
while (low <= high)
{
int mid = (low + high) >> 1;
if (array[mid] > number)
{
high = mid - 1;
}
else if (array[mid] < number)
{
low = mid + 1;
}
else
{
resultfirst = mid;
high = mid - 1;
}
}
low = 0;
high = array.Length - 1;
while (low <= high)
{
int mid = (low + high) >> 1;
if (array[mid] > number)
{
high = mid - 1;
}
else if (array[mid] < number)
{
low = mid + 1;
}
else
{
resultlast = mid;
low = mid + 1;
}
}
string? indexes = "";
int counter = 0;
for (int i = resultfirst; i <= resultlast; i++)
{
counter++;
if (i == resultfirst)
{
indexes += Convert.ToString($"{i}");
}
else
{
indexes += Convert.ToString($", {i}");
}
}
indexes += ".";
if (resultfirst == -1 && resultlast == -1)
{
Console.WriteLine($"\nNumber {number} was not found in the Array");
}
else if (resultfirst == resultlast)
{
Console.WriteLine($"Number {number} was found only 1 time in the array. Index is: {resultfirst}");
}
else
{
Console.WriteLine($"\nNumber {number} was found {counter} times in the array. Indexes are: {indexes}");
}
}
具有两个嵌套 int 方法的字符串方法
string IndexFinderArrayBS(int number, int[] array)
{
int resultfirst = IndexFinderArrayBSFirst(number, array);
int resultlast = IndexFinderArrayBSLast(number, array);
string? indexes = "";
int counter = 0;
for (int i = resultfirst; i <= resultlast; i++)
{
counter++;
if (i == resultfirst)
{
indexes += Convert.ToString($"{i}");
}
else
{
indexes += Convert.ToString($", {i}");
}
}
indexes += ".";
if (resultfirst == -1 && resultlast == -1)
{
return string.Format("\nNumber {0} was not found in the Array", number);
}
else if (resultfirst == resultlast)
{
return string.Format("\nNumber {0} was found only 1 time in the array. Index is: {1}", number, resultfirst);
}
else
{
return string.Format("\nNumber {0} was found {1} times in the array. Indexes are: {2}", number, counter, indexes);
}
}
和 int 方法之一
int IndexFinderArrayBSFirst(int number, int[] array)
{
int low = 0;
int high = array.Length - 1;
int result = -1;
while (low <= high)
{
int mid = (low + high) >> 1;
if (array[mid] > number)
{
high = mid - 1;
}
else if (array[mid] < number)
{
low = mid + 1;
}
else
{
result = mid;
high = mid - 1;
}
}
return result;
}
每种方法都应该是原始且易于理解的。很多很多小方法看不懂,一个方法一堆代码也看不懂,中间的某个地方应该就明白了。
您已经听说过 SOLID / SRP,但这个原则更多地适用于类,而不是方法,因此根据 SRP 将部分代码移动到其他类应该会更好地修饰画面。
不总是。
适度的一切都很好。有一项任务 - 为它做一个单独的方法。有重复的代码 - 制定一种避免重复的方法等。