可读性与性能比较



我正在审查我正在从事的项目中存在的一些代码,并找到了这样的事情:

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

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

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

如果您确实在乎可读性,我将传递尽可能多的现成对象。在添加或删除属性时,这也一直保持方法签名,因此也许是最好的(感谢Sergey):

personModel.editPerson(currentPerson);

最新更新