Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ModIntFenwickTree を作成 #56

Closed
wants to merge 2 commits into from
Closed

ModIntFenwickTree を作成 #56

wants to merge 2 commits into from

Conversation

kzrnm
Copy link
Owner

@kzrnm kzrnm commented Sep 16, 2020

#55 の実装を FenwickTree に適用

@kzrnm kzrnm changed the title Mod int fenwick tree ModIntFenwickTree を作成 Sep 16, 2020
@key-moon
Copy link
Contributor

WIP なものですが、私は比較周辺は例外を投げたほうが嬉しい挙動かと思いました。いかがでしょうか?

@kzrnm
Copy link
Owner Author

kzrnm commented Sep 17, 2020

検討してみました。
例外を投げたり適当に実装したりするより、算術演算インターフェイスと比較演算インターフェイスを分割してしまうのが良いのではないかと考えました。

FenwickTree では算術演算のみを使用します。

対応する場合は、#47 と衝突するので #47 のマージ後にします。

public interface IArithmeticOperator<T> where T : struct
{
    /// <summary>
    /// Addition operator +
    /// </summary>
    /// <returns><paramref name="x"/> + <paramref name="y"/></returns>
    T Add(T x, T y);
    /// <summary>
    /// Subtraction operator -
    /// </summary>
    /// <returns><paramref name="x"/> - <paramref name="y"/></returns>
    T Subtract(T x, T y);
    /// <summary>
    /// Multiplication operator *
    /// </summary>
    /// <returns><paramref name="x"/> * <paramref name="y"/></returns>
    T Multiply(T x, T y);
    /// <summary>
    /// Division operator /
    /// </summary>
    /// <returns><paramref name="x"/> / <paramref name="y"/></returns>
    T Divide(T x, T y);
    /// <summary>
    /// Remainder operator %
    /// </summary>
    /// <returns><paramref name="x"/> % <paramref name="y"/></returns>
    T Modulo(T x, T y);

}

public interface IComparisonPperator<T> : IEqualityComparer<T>, IComparer<T> where T : struct
{
    /// <summary>
    /// Greater than operator &gt;
    /// </summary>
    /// <returns><paramref name="x"/> &gt; <paramref name="y"/></returns>
    bool GreaterThan(T x, T y);
    /// <summary>
    /// Greater than or equal operator &gt;=
    /// </summary>
    /// <returns><paramref name="x"/> &gt;= <paramref name="y"/></returns>
    bool GreaterThanOrEqual(T x, T y);
    /// <summary>
    /// Less than operator &lt;
    /// </summary>
    /// <returns><paramref name="x"/> &lt; <paramref name="y"/></returns>
    bool LessThan(T x, T y);
    /// <summary>
    /// Less than or equal operator &lt;=
    /// </summary>
    /// <returns><paramref name="x"/> &lt;= <paramref name="y"/></returns>
    bool LessThanOrEqual(T x, T y);
}

public interface INumOperator<T> : IArithmeticOperator<T>, IComparisonPperator<T> where T : struct
{
    /// <summary>
    /// MinValue
    /// </summary>
    public T MinValue { get; }
    /// <summary>
    /// MaxValue
    /// </summary>
    public T MaxValue { get; }
}

@key-moon
Copy link
Contributor

この実装については、そこだけ分けるならば他も分けるべきなのではと思ってしまいます。

IArithmeticOperator を実装するものでも DivideModulo が実装されることのない、ましてや Add 以外無い等のケースがありえますので、意味のある実装ができない部分に例外を投げるのが不適であるならば細かく分けるべきだと思います。
なので、それよりは現状のように一旦全ての実装されうる演算子をまとめて提供していしまうのが良いのではないかと思っていました。

なので、もしインターフェイスを複数に分けるならば

interface IAddOperator<T> { T Add(T x, T y); }
interface ISubtractOperator<T> { T Subtract(T x, T y); }interface IModuloOperator<T> { T Modulo(T x, T y); }

としてしまい、実装側で

interface IMFOperator<T> : IAddOperator<T>,{ }

class MFGraph<TValue, TOp>
     where TValue : struct
     where TOp : IMFOperator<T>//又は IAddOperator<T>等を直書き

のようにするべきだと感じます。
実装し直すならばこの実装で私は問題ないと思うのですが、いかがでしょうか?

それはそれとして、一旦インターフェイスを改良するならば #33 での再議論をするべきだとも思います。

@kzrnm kzrnm closed this Sep 19, 2020
@kzrnm kzrnm deleted the ModIntFenwickTree branch September 19, 2020 05:28
kzrnm added a commit that referenced this pull request Feb 27, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants