避免代码重复(常量正确性)redux

Posted

技术标签:

【中文标题】避免代码重复(常量正确性)redux【英文标题】:Avoiding code duplication (const-correctness) redux 【发布时间】:2010-09-25 22:38:46 【问题描述】:

我在这里阅读了这个question here 关于 const 正确性的内容。 Scott Meyer 解决方案似乎是一个很好的解决方法,但是如果您有一个使用 this 指针的成员函数(需要 const 和非 const 版本)怎么办。如果成员函数是const,那么this 自动表示const this,这使得在大部分代码所在的位置很难有一个const 函数。

我想到的一种可能的解决方法是将this 的引用作为参数传递给 const 函数,因此该函数可以使用该引用而不是直接使用this 指针。但是,这样安全吗?它似乎是安全的(如果非常hacky),因为您实际上并没有在const-object上使用const_cast。相反,您只是通过传递对象的非常量引用来规避const 成员函数提供的契约。

例如:

class Foo

    private:

    template <class SelfReference>    
    void f1(SelfReference& self) const
     
        // We now might have a non-const reference to "this", even though
        // we're in a const member function.  But is this safe???
    

    public:    

    void f2()
    
        f1(*this);
    

    void f2() const
    
        f1(*this);
    
;

这似乎提供了一种很好的方法,可以避免在需要函数的 const 和非 const 版本时重复大量代码,但这安全吗?还是它会以某种方式导致未定义的行为?

【问题讨论】:

可能是this的副本? 【参考方案1】:

注意,即使你在 const f1() 函数中并且可以修改“this”,f2() 也被标记为非常量,因此通过调用 f2() 对象可能会被修改。并且 f1() 单独不会让您在其自身(或任何 const 对象)中修改“this”。你甚至不能调用f2() 来帮助const Foo 对象,所以这不会带来任何好处。

换句话说-在您的示例中,非常量 f1() 就足够了。这里不需要f1() const 或两个版本。


更新 现在,您将无法在 f1() 的“const”版本中修改 self,即从 void f2() const 调用的 void f1(const Foo & self) const

【讨论】:

我稍微修改了一下:想法是你有两个版本的 f2(const 和 non-const),它们都调用 f1,即const。但是,f2 的非 const 版本传递一个非 const 自引用,而 f2 的 const 版本传递一个 const 自引用。所以想法是大部分逻辑都可以进入 f1 以避免重复。 我明白这一点 - 但这个想法实际上并不是从常量成员函数修改this,而只是为了避免代码重复。因此,如果出于任何原因 f1 必须使用 this 指针,例如将其传递给迭代器或其他东西,则无需编写 f1 的单独 const 版本。 @Channel72:如果你不修改对象,那么const版本的方法就足够了。您可以从非常量调用const 函数。在这种情况下,您永远不需要非常量版本的函数,因此不会重复代码。

以上是关于避免代码重复(常量正确性)redux的主要内容,如果未能解决你的问题,请参考以下文章

导入单个 Django 设置常量以避免完整设置导入开销的正确方法?

在带有Redux的ReactJS中避免竞争条件

不确定如何正确更新 Redux 中的状态

如何重构 redux + thunk 动作/常量

php之常量

如何避免重定向两次(react-router-redux)?