可读性与性能比较

时间:2015-05-06 10:18:46

标签: c# .net performance readability

我正在审核我正在处理的项目中的一些代码,并发现了类似的内容:

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, ...);
    ...

editPerson方法:

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);
    ...

editPerson方法:

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);
    ....
}

你能理解我的怀疑吗?

2 个答案:

答案 0 :(得分:7)

我会使用Introduce Parameter Object重构。如果您有一组自然组合在一起的参数(人名,人年龄等),则将它们分组到对象中并将其作为单个参数传递。

因此,您已经拥有了这样的变量分组,您只需传递当前人物对象:

personModel.editPerson(currentPerson);

正如Uncle Bob所说,理解和维护的最佳方法是没有参数的方法。一个参数很容易理解。两个更难。我的经验法则 - 使用不超过3个参数(当然,这并不总是可行,但我尝试遵循该规则)。

注意 - 如果你必须在某处传递很多参数,那么你可能需要单独生成数据和逻辑。尝试将它们组合起来,避免传递数据。例如。而不是

 bankService.Charge(account.Id, account.Type, account.Balance, amount);

您可以将此逻辑考虑在内:

 account.Charge(amount); 

答案 1 :(得分:2)

如果您再也不会使用变量(var today = new Date(); var dd = today.getDate(); var mm = today.getMonth()+1; //January is 0! var yyyy = today.getFullYear(); if(dd<10){ dd='0'+dd } if(mm<10){ mm='0'+mm } var today = yyyy+'-'+mm+'-'+dd; idNr等),编译很可能会省略这些分配,性能也会相同。

关于哪一个最具可读性的讨论,我不能说太多:一个喜欢一个,我喜欢另一个。对此没有达成共识,作为开发团队,您应该为自己达成共识。

如果你关心可读性,我会尽可能多地传入现成的对象。这也在添加或删除属性时保持方法签名,所以这可能是最好的(感谢Sergey):

personName