将宏用于重复代码是否可以接受?

时间:2019-03-26 16:37:42

标签: c++

在我的代码中,我有数十个结构,如下所示:

def change
  GolfRetailer.in_batches.update_all(duplicate_domain: false)

  change_column_null :golf_retailers, :duplicate_domain
end

编写诸如以下的宏是否可以接受:

    [HttpGet]
    [Route("api/controller/getlastresult/{id}")]
    public IActionResult GetLatestResultForController(string id)
    {
        Response.ContentType = "application/json";

        var list = _dbAccessLayer.GetAllVoteResults();
        var appropriateResults = list.Where(item => item.DeviceId.Equals(id) && item.Status == "Finished")
            .OrderBy(item => item.TimeStarted);

        if (appropriateResults.Any())
            return Ok(Json(appropriateResults.Last().Result));

        return BadRequest();
    }

所以我可以拥有这样的结构?

struct foo {
private:
    params _someParams;
public:
    foo(const params& p) noexcept : _someParams(p) { }
    void banana() { }
    void apple() { }
};

struct bar {
private:
    params _someParams;
public:
    foo(const params& p) noexcept : _someParams(p) { }
    void watermelon() { }
    void orange() { }
    void strawberry() { }
};

2 个答案:

答案 0 :(得分:4)

在一般情况下,我不会回答。它是基于观点和/或过于广泛的。

在这种情况下,不会。

struct base {
  params _someParams;
  base( params const& p ) noexcept:
    _someParams(p)
  {}
};  
struct foo:private base {
  using base::base;
  void banana() { }
  void apple() { }
};

改用它。

继承ctor可让您重新发布私有基础ctor。私人基地可以很好地存储您的参数。

结果是可调试的,并且愚蠢的错字引起问题的可能性很小,因为每个结构的样板很简单,大约与您的宏解决方案一样短。

答案 1 :(得分:-1)

可以接受的是相对于您的团队而言的,但是我在代码很小且简单的情况下使用了它。不过请考虑一下缺点:您将无法像普通代码一样逐行调试代码。大多数调试器都不擅长单步执行宏。

在方案“ PARAMS_AND_CTOR”中,您将非常接近使用宏尝试创建新的语言。当您这样做时,人们现在不仅需要了解所有C ++,而且还需要了解您的自定义宏。这使得了解您的代码的学习曲线非常陡峭。

在极端情况下,我已经看到人们使用它使C看起来像Pascal。