我正在审查我正在从事的项目中存在的一些代码,并找到了这样的事情:
string personName = currentPerson.Name;
personModel.editPerson(idNr, personName);
以上是一个简单的示例,但也可能如下:
string idNr= currentPerson.IdNr;
string personName = currentPerson.Name;
string age = currentPerson.Age;
...
string editor = AuthenticatedUser.Name;
personModel.editPerson(idNr, personName, age, gender, whatever, nationality, ..., currentTime, editor, weather, windspeed, topScorer, teethAmount, ...);
问题:以上应该由以下方式替换:
personModel.editPerson(currentPerson.idNr, currentPerson.Name);
和:
personModel.editPerson(currentPerson.idNr, currentPerson.Name, currentPerson.Age, currentPerson.Gender, currentPerson.Whatever, currentPerson.Nationality, ..., theTime.current, weather.Status, wind.speed, scorers.topScorer, mouth.teethAmount, ...);
分别?
我认为,对于可读性,将这些值放入变量更好,但是我猜想性能会受到影响(即使轻轻)。对于第一个示例,如果使用很少的参数,则性能损失将更轻。
在我们的团队中,有人说最好以低廉的绩效损失价格拥有可读性(特别是针对初级开发人员)结束会导致可能注意到的性能。
编辑
我将尝试解释我用值填充对象并以示例分发它们的意思。
想象一个具有多个输入的表格:
public ActionResult _SavePerson(string id, string name, ...)
{
personModel.editPerson(id, name, ...);
...
编辑方法:
public void editPerson(string id, string name, ...)
{
webService1.client client = new ....;
webService1.personType pt = new ...;
pt.name = name;
pt.id = id;
pt. ....;
client.setPerson(pt);
....
}
如果我要通过一个参数将对象传递:
public ActionResult _SavePerson(string id, string name, ...)
{
Person person = new ...;
person.id = id;
person.name = name;
personModel.editPerson(person);
...
编辑方法:
public void editPerson(Person person)
{
webService1.client client = new ....;
webService1.personType pt = new ...;
pt.name = person.name;
pt.id = person.id;
pt. ....;
client.setPerson(pt);
....
}
您能在这里理解我的疑问吗?
我将使用介绍参数对象进行重构。如果您有一组自然融合在一起的参数(人名,人年龄等),则将它们分组为对象并将其作为一个参数传递。
因此,您已经有这样的变量分组,您可以通过当前的对象:
personModel.editPerson(currentPerson);
正如鲍勃叔叔所说,理解和维护的最佳方法是没有参数的方法。一个参数易于理解。两个更难。我的经验法则 - 使用不超过3个参数(当然,这并非总是可能的,但我尝试遵守该规则)。
注意 - 如果您必须在某个地方传递很多参数,那么您可能会单独使用数据和逻辑。尝试将它们结合起来并避免通过数据。例如。而不是
bankService.Charge(account.Id, account.Type, account.Balance, amount);
您可以将此逻辑移动:
account.Charge(amount);
如果您不再使用变量(idNr
,personName
等),则编译很可能会省略这些作业,并且性能将相同。
在讨论哪个最可读性的讨论中,我不能说太多:一个喜欢一个,我喜欢另一个。关于这一点没有共识,您作为开发团队应该对自己的共识做出共识。
如果您确实在乎可读性,我将传递尽可能多的现成对象。在添加或删除属性时,这也一直保持方法签名,因此也许是最好的(感谢Sergey):
personModel.editPerson(currentPerson);