sakura-editor / sakura

SAKURA Editor (Japanese text editor for MS Windows)
https://sakura-editor.github.io/
Other
1.23k stars 162 forks source link

カスタムメニューデータを管理する CommonSetting_CustomMenu をリファクタリングしたい #1160

Open m-tmatma opened 4 years ago

m-tmatma commented 4 years ago

要望機能

カスタムメニューデータを管理する CommonSetting_CustomMenu をリファクタリングしたい

現状

https://github.com/sakura-editor/sakura/blob/a48fdb5ff3f7fffd7f282025f19f349356f44895/sakura_core/env/CommonSetting.h#L441-L451

変更案

struct CommonSetting_CustomMenuItem
{
    WCHAR           m_szCustMenuNameArr[MAX_CUSTOM_MENU_NAME_LEN + 1];
    int             m_nCustMenuItemNumArr;
    EFunctionCode   m_nCustMenuItemFuncArr[MAX_CUSTOM_MENU_ITEMS];
    KEYCODE         m_nCustMenuItemKeyArr[MAX_CUSTOM_MENU_ITEMS];
    bool            m_bCustMenuPopupArr;
};

struct CommonSetting_CustomMenu
{
    CommonSetting_CustomMenuItem menu[MAX_CUSTOM_MENU];
};

現状の問題点

メニュー項目ごとにデータが分かれていないので、メニュー項目ごとに関数化したり 処理を分けにくい。

スクリーンショット

berryzplus commented 4 years ago

趣旨は理解しましたが、難しいだろうな、と思いました。

元定義

struct CommonSetting_CustomMenu
{
    WCHAR         m_szCustMenuNameArr   [MAX_CUSTOM_MENU][MAX_CUSTOM_MENU_NAME_LEN + 1];
    int           m_nCustMenuItemNumArr [MAX_CUSTOM_MENU];
    EFunctionCode m_nCustMenuItemFuncArr[MAX_CUSTOM_MENU][MAX_CUSTOM_MENU_ITEMS];
    KEYCODE       m_nCustMenuItemKeyArr [MAX_CUSTOM_MENU][MAX_CUSTOM_MENU_ITEMS];
    bool          m_bCustMenuPopupArr   [MAX_CUSTOM_MENU];
};

構造を整理してみた(推定)

struct CommonSetting_CustomMenu
{
    //! 定義済みカスタムメニューの数
    int           m_nCustMenuNum;

    //! カスタムメニュー定義の配列
    struct CommonSetting_CustomMenuDef
    {
        WCHAR         m_szCustMenuName[MAX_CUSTOM_MENU_NAME_LEN + 1];
        bool          m_bCustMenuPopup;   //!< ポップアップメニューかどうか
        int           m_nCustMenuItemNum; //!< メニュー項目数

        //! メニュー項目定義の配列
        struct CommonSetting_CustomMenuItem
        {
            EFunctionCode m_nCustMenuItemFunc; //!< 機能ID
            KEYCODE       m_nCustMenuItemKey;  //!< ニーモニック
        }             m_aCustMenuItemArr[MAX_CUSTOM_MENU_ITEMS];

    }             m_aCustomMenuArr[MAX_CUSTOM_MENU];
};

おそらく、現状の古臭いデータ構造のほうが、拡張性は高いと思います。

古臭いデータ構造の場合、影響があるのはその項目の配列のみで、 他の配列には影響を与えないことができます。

論理的なデータ構造単位に配列を組みなおしてしまうと、 一つメンバーデータの追加・削除を行っただけで配列領域全部の構造がズレてしまいます。

berryzplus commented 4 years ago

ちなみに、CommonSettings_CustomMenuは、 サクラエディタの全設定項目で ACHAR型 の設定項目を持つ唯一の構造体です。

独自定義の KEYCODE 型が ACHAR 型と同じ char 型を意味するからなんですが、 ここに入る値は「文字」ではなくてWindowsの仮想キーコード(0~255の数値)なので 厳密にいうと「入出力データの型を取り違えている」ような気がします。

CDataProfileのリファクタリング予定には、その辺の対策案が組み込まれていた理します。 https://github.com/sakura-editor/sakura/pull/1152/commits/669b4dc04de7b979df3cfa028f8838efd049171b

まー、「やらん」というわけじゃないですけど、 「難しいんだろうな・・・」という印象を持っています。