可读性与性能比较

Readability vs Performance comparison

我正在审查我正在从事的项目中存在的一些代码,发现了如下内容:

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

你能理解我这里的疑惑吗?

如果您不再使用这些变量(idNrpersonName 等),编译很可能会忽略这些赋值并且性能将相同。

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

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

personModel.editPerson(currentPerson);

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

因此你已经有了这样的变量分组,你可以只传递当前的人对象:

personModel.editPerson(currentPerson);

正如Uncle Bob所说,理解和维护的最好方法是不带参数的方法。一个参数很容易理解。二更难。我的经验法则 - 使用不超过 3 个参数(当然,这并不总是可能的,但我尽量遵循该规则)。

注意 - 如果您必须在某处传递大量参数,那么可能您的数据和逻辑是分开的。尝试将它们结合起来并避免传递数据。例如。而不是

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

你可以把这个逻辑考虑进去:

 account.Charge(amount);