【问题标题】:Which implementation is better for code readability?哪种实现对代码可读性更好?
【发布时间】:2021-08-28 10:31:33
【问题描述】:

我有这段代码,其目的只是将所有区域初始化为false

Zone per_zone;
std::fill_n(per_zone.begin(), per_zone.capacity(), false);
System per_system;
std::fill_n(per_system.begin(), per_system.capacity(), per_zone);
std::fill_n(m_pMemory->TrackingZonesShowingLogicalParcels.begin(), m_pMemory->TrackingZonesShowingLogicalParcels.capacity(), per_system);

我用下面的代码对其进行了重构,因为我认为它表达的意图更清楚,而且更短。

for (auto& group : m_pMemory->TrackingZonesShowingLogicalParcels)
    for (auto& system : group)
        for (auto& zone : system)
            zone = false;

我真的会使用算法,因为我知道 - 一般来说 - 算法比 for 循环更清楚地表达意图,但我认为情况并非如此。

我错了吗? 还有另一种方法可以使用 std 算法使代码更具可读性吗?

请注意,我不关心性能。 谢谢。

【问题讨论】:

  • 什么是Zone?它应该有一个构造函数来获取值并初始化元素,以便您可以编写 Zone per_zone{false}; 或者将其设为默认值,因此您只需编写 Zone per_zone;
  • 鉴于缺乏上下文和细节,“什么更具可读性”纯粹是基于意见的
  • 一般成员应该通过调用构造函数来初始化,如果一个类不这样做但你必须做一些额外的事情我会认为类坏了(好吧,在某些特殊情况下必须例外)
  • 与你的问题无关,但我真的希望capacity()std::vector<>::capacity()不是一回事
  • 将基于意见的可读性部分放在一边。这两个代码块表达了两种不同的东西。它们可能导致相同的结果,但是如果您阅读代码而不仔细查看数据类型,它们具有不同的含义。因此,如果我应该在这两个(或任何其他解决方案)之间做出决定,它会根据它的含义是否正确来决定。

标签: c++ readability


【解决方案1】:

我不知道 OP 是否可以使用 C++20,但能够迭代像这样的深度嵌套层次结构的一般想法正是 std::ranges::join_view 的用途。

使用它,您可以将目标元素的聚合和对聚合引用的操作分离为两个不同的操作:

#include <ranges>
#include <vector>
#include <algorithm>

struct Memory {
    using System = std::vector<int>;
    using Group = std::vector<System>;
    std::vector<Group> TrackingZonesShowingLogicalParcels;
};

 void foo(Memory* m_pMemory)
 {
     // Create a view representing all of the zones
     auto all_zones = m_pMemory->TrackingZonesShowingLogicalParcels | std::views::join | std::views::join;

     // use that view as if it was a container.
     std::fill(all_zones.begin(), all_zones.end(), 1);
 }

【讨论】:

  • 感谢您的回答,遗憾的是我无法使用 c++20 标准 atm,但我可以访问 boost 库。您对在提升范围内使用这种方法有什么建议吗?
  • @Dundo 如果您可以引入仅标头范围-v3,那么它应该只是一个替代品。不过不确定提升范围。
猜你喜欢
  • 2016-06-21
  • 2020-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-02
  • 1970-01-01
相关资源
最近更新 更多