我这里有两个方法(killZombie),它们处理有一个参数(string)或多个参数(string[])的情况。因为它们做的是相同的事情,所以我创建了另一个名为"killAZombie“的方法,供其他两个方法使用。我遇到的问题是"killAZombie“方法被命名为...嗯,有点奇怪。这是其他人也会遇到的问题吗?解决这个问题的最好方法是什么,并将我的"KillAZombie“方法命名为其他与"killZombie”更清楚地区分开来的方法?
public void killZombie(string zombieLocation){
killAZombie(zombieLocation);
}
public void killZombie(string[] zombieLocations){
foreach(string zombieLocation in zombieLocations){
killAZombie(zombieLocation);
}
}
public void killAZombie(string zombieLocation){
//Kills a zombie at specified location
}我认为解决这个问题的另一种方法是用两种不同的方法来代替重载"killZombie“:
public void killZombie(string zombieLocation){
//Kills a zombie at specified location
}
public void killZombies(string[] zombieLocations){
foreach(string zombieLocation in zombieLocations){
killZombie(zombieLocation);
}
}这样,我们只有两个更容易理解的方法,但方法不会被重载。在我看来,重载方法似乎是一件好事(这只是意味着方法更少,杂乱更少),所以我也不确定这个解决方案。我很想知道解决这个问题的最好方法是什么,谢谢!
附录:
我的方法实际上有4个参数,所以参数应该在最后。params变量是最重要的一个,所以把它作为最后一个参数来使params起作用看起来有点笨拙。我关心的是把最重要的参数放在最后,是否足够合理将方法划分为KillZombie和KillZombies,或者参数仍然是正确的方法吗?
发布于 2011-02-14 23:04:51
在这种情况下,您的两个选择中的后一个可能更可取(假设函数的命名意味着它在单个“僵尸”上操作。
但是,您可能还想查看params关键字,以便知道您的选项是什么。例如,如果您简单地将函数命名为Kill (如果在此上下文中这样做是有意义的),您可以这样做:
public void Kill(params string[] zombieNames)
{
foreach(string name in zombieNames)
{
}
}你可以用很多种方式来称呼它:
Kill("Zoey");
Kill("Francis", "Zoey");
string[] survivors = { "Zoey", "Francis", "Bill", "Louis" };
Kill(names);(当然,假设你的幸存者都变成了僵尸!)
此外,在风格上,C#代码通常对函数名称使用pascal大小写(KillAZombie而不是killAZombie)。
附录的编辑
是的,参数排序--虽然它与技术无关--是应用程序接口设计中的一个重要考虑因素,因此,如果您打算采用“不太重要”的参数,那么您可能不得不不使用params。
话虽如此,我将坚持我最初的建议:由于函数的名称是(KillZombie与Kill),为了使您的名称与参数保持一致,我会坚持使用两个版本。我还建议允许用户指定IEnumerable<string>而不是数组。这将允许开发人员使用实现IEnumerable<string>的任何东西来传递名称,包括字符串数组。
发布于 2011-02-14 23:07:37
这里有一些想法。
首先,公共方法的C#约定是将它们大写:"KillZombie",而不是"killZombie“。
如果你愿意,你可以用一种方法来完成这项工作。下面是一个获取一个或多个位置的方法。调用者可以只提供一个列表:KillZombies(location1, location2, location3);
private void KillOneZombie(string location) { ... }
public void KillZombies(string location, params string[] additionalLocations)
{
KillOneZombie(location);
if (additionalLocations == null) return;
foreach(string additionalLocation in additionalLocations)
KillOneZombie(additionalLocation);
}如果您确实希望有两个方法,请考虑让一个方法接受IEnumerable<string>而不是数组;这样调用者就可以传入列表、查询、数组等等。
您的第二种命名模式更标准: KillZombie和KillZombies。
参数是最重要的一个,所以把它作为最后一个参数来使参数工作似乎有点笨拙。我关心的是把最重要的参数放在最后,是否足够合理将方法划分为KillZombie和KillZombies,或者参数仍然是正确的方法吗?
我会考虑你希望如何使用这种方法。请考虑以下示例:
Console.WriteLine("User: {0} Score: {1}", user[i].Name, scores[i]);在这里,我们清楚地期望"params“将用于在调用方中支持可变数量的参数。从来没有人这样做过:
object[] results = new object[] { user[i].Name, scores[i] };
Console.WriteLine("User: {0} Score: {1}", results);尽管这是完全合法的。如果您希望像Console.WriteLine一样使用您的方法,其中将传入不同数量的参数,但参数的数量在编译时是已知的,那么可以使用params。
如果您希望将其用于第二种模式--某人有一个位置数组--那么不要使用参数;创建两个方法KillZombie和KillZombies,并让其中一个接受字符串的IEnumerable。
发布于 2011-02-14 23:04:11
在这种情况下,我可能会采用您的第二个建议。KillZombie杀死一个僵尸;KillZombies杀死多个僵尸。
另一种选择是使用带有params参数的单个方法:
KillZombies("foo"); // kill a single zombie
KillZombies("foo", "bar"); // kill multiple zombies
// ...
public void KillZombies(params string[] zombieLocations)
{
foreach (string zombieLocation in zombieLocations)
{
// kills a zombie at specified location
}
}(还要注意,标准的C#命名约定是使用带有大写“K”的KillZombie/KillZombies。)
https://stackoverflow.com/questions/4993653
复制相似问题