我编写了一个小方法,将数字从基数-10数字系统转换为任何数字系统(代码并不完美,但这不是重点)。我的问题是,我是否有正确的单一责任原则。第二种方法比第一种方法好吗?还是“charReplace”功能太小,无法创建自己的方法?
public static string convertNumber(BigInteger num, int baseNum)
{
string symbols = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
if (baseNum < 2 || symbols.Length + 10 < baseNum)
{
throw new Exception;
}
var result = "";
do
{
var partResult = (int)(num % baseNum);
if (partResult >= 10)
{
result = result.Insert(0, symbols[partResult - 10].ToString());
}
else
{
result = result.Insert(0, partResult.ToString());
}
num /= baseNum;
} while (num != 0);
return result;
}与
static readonly string Symbols = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
public static string convertNumber(BigInteger num, int baseNum)
{
if (baseNum < 2 || Symbols.Length + 10 < baseNum)
{
throw new Exception;
}
var result = "";
do
{
var partResult = (int)(num % baseNum);
result = result.Insert(0, charReplace(partResult));
num /= baseNum;
} while (num != 0);
return result;
}
private static string charReplace(int number){
if (number < 10){
return number.ToString();
}
return Symbols[number - 10].ToString();
}发布于 2017-03-11 21:11:49
我相信第一种方法已经足够好了,因为它个人的可读性更强。
小建议
symbols字符串中,而不是只存储字母。这可以简化逻辑。总结:
public static string ConvertNumber(BigInteger num, int baseNum)
{
const string symbols = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
if (baseNum < 2 || symbols.Length < baseNum)
{
throw new ArgumentOutOfRangeException(nameof(baseNum));
}
if (num < 0)
{
throw new ArgumentOutOfRangeException(nameof(num));
}
var resultLength = 1 + Math.Max((int)BigInteger.Log(num, baseNum), 0);
var result = new char[resultLength];
int index = resultLength - 1;
do
{
result[index--] = symbols[(int)(num % baseNum)];
num /= baseNum;
} while (num != 0);
return new string(result);
}PS。建议将UpperCamelCase中的所有类和所有方法命名,而不管它们是否公开。
https://codereview.stackexchange.com/questions/157512
复制相似问题