◀ANSI版開発トップへ
  • 1000 最近使ったファイル - テスト
    • 1001 Re:最近使ったファイル - テスト
    • 1008 Re: 最近使ったファイル - テスト
      • 1010 Re2: 最近使ったファイル - テスト
        • 1011 Re3: 最近使ったファイル - テスト
          • 1013 Re4: 最近使ったファイル - テスト
    • 1030 気づいたこと 12/27
      • 1031 Re: 気づいたこと 12/27
      • 1032 Re:気づいたこと 12/27
        • 1033 Re2:気づいたこと 12/27
        • 1034 Re:気づいたこと 12/27
          • 1039 Re2:気づいたこと 12/27
            • 1042 Re3:気づいたこと 12/27
  • [1000] 最近使ったファイル - テスト やざき 2001年12月24日 14:23

    最近使ったファイルを管理する変数に、
    クラス経由でアクセスすることを提案します。
    そして、クラス(CMRUクラス)経由でアクセスするように変更したファイルを共有フォルダにアップロードしました。
    ファイル名は、cmru_test-2001-12-24.zipです。

    クラス経由でアクセスすると、、

    ・共有メモリへのアクセスコードが一箇所にまとまって見通しがよくなる。
    ・共有メモリに仕様変更があっても、アクセスクラスだけ変更すればいい。

    ってなるといいなぁ(^^;
    そして最終的には、共有メモリをすべてクラス経由でアクセスするようにしたいなぁ。
    と思ってます。

    で、副作用として、
    ・最近使ったファイルの一覧が、本来管理されるものよりも
     すくなかったバグを修正。

    コメント歓迎です。
    • [1001] Re:最近使ったファイル - テスト やざき 2001年12月24日 16:03

      > ・最近使ったファイルの一覧が、本来管理されるものよりも
      >  すくなかったバグを修正。

      これ勘違いでした。
      「共通設定」の「全般」→「ファイルの履歴MAX」を無視するバグ追加(をい)

      > コメント歓迎です。
    • [1008] Re: 最近使ったファイル - テスト げんた 2001年12月25日 16:25

      >クラス経由でアクセスすることを提案します。
      * CMRU.hではなくCShareData.hで宣言されているのは何故?相互にインクルードされていてうまくいかなかったからやめたとか(^^)

      * CMRUは内部にデータを保持しているわけではないので,singletonにする必要性はない.コンストラクタでShareDataを取得し,デストラクタでそれを解放すれば十分.

      * 中身はコピーしただけのようだが,せっかくなのでバグも直してくれれば(^^;) &の表示を調整するところ.は+3のバッファを取っているが,これは&が3つ以上あったら後ろにはみ出します.

      * Length()のように明らかに1行しかないような関数はclass定義に書いてinline展開させた方がいいと思います.

      * GetFileInfo()で「無防備」となっているところは const FileInfo* を返すようにすれば安全になるはず.ただし,受ける方もconst宣言してつじつまを合わせないと行けない.

      * 170,181行目(Add()内)「これでポインタの代入をしている。」というのは実体をコピーしているの誤り.

      * ClearAll() の「deleteしなくていいのか」は既に確保した領域を使いまわすのでdeleteではない.

      * GetPathListは予め実際の個数+1の領域が確保されていることを前提としているが,呼び出し元で「ここでnewするのは危険」と書くぐらいなら std::vector<const char*> に入れてもらった方が呼び出す方もポインタを扱わなくて良いので安全だと思う.
      • [1010] Re2: 最近使ったファイル - テスト やざき 2001年12月25日 16:33

        ▼ げんたさん

        コメント感謝です :-)

        > >クラス経由でアクセスすることを提案します。
        > * CMRU.hではなくCShareData.hで宣言されているのは何故?相互にインクルードされていてうまくいかなかったからやめたとか(^^)

        そうです :-)
        そこまで気合は入れてない。テストだしね。

        > * CMRUは内部にデータを保持しているわけではないので,singletonにする必要性はない.コンストラクタでShareDataを取得し,デストラクタでそれを解放すれば十分.

        じゃぁどこにCMRUを置きます?
        それを考えるのが面倒だったので、Singletonにしたんですけど。


        > * 中身はコピーしただけのようだが,せっかくなのでバグも直してくれれば(^^;) &の表示を調整するところ.は+3のバッファを取っているが,これは&が3つ以上あったら後ろにはみ出します.

        おお鋭い。パッチに期待します。

        > * Length()のように明らかに1行しかないような関数はclass定義に書いてinline展開させた方がいいと思います.

        趣味の範囲のような。いまどきコンパイラでやってくれてるのでは?


        > * GetFileInfo()で「無防備」となっているところは const FileInfo* を返すようにすれば安全になるはず.ただし,受ける方もconst宣言してつじつまを合わせないと行けない.

        了解。

        > * 170,181行目(Add()内)「これでポインタの代入をしている。」というのは実体をコピーしているの誤り.

        ご指摘どおり :-)

        > * ClearAll() の「deleteしなくていいのか」は既に確保した領域を使いまわすのでdeleteではない.

        こちらもご指摘どおり :-)

        > * GetPathListは予め実際の個数+1の領域が確保されていることを前提としているが,呼び出し元で「ここでnewするのは危険」と書くぐらいなら std::vector<const char*> に入れてもらった方が呼び出す方もポインタを扱わなくて良いので安全だと思う.

        いろいろ考えてみます。
        • [1011] Re3: 最近使ったファイル - テスト げんた 2001年12月25日 17:56

          >> singletonにする必要性はない.
          >じゃぁどこにCMRUを置きます?
          使いたいときに変数を宣言して,いらなくなったら or スコープから外れたらおしまい.全体で共通の実体を持つ必要はありません.
          >> * Length()のように明らかに1行しかないような関数はclass定義に書いてinline展開させた方がいいと思います.
          >趣味の範囲のような。いまどきコンパイラでやってくれてるのでは?
          class定義の外側にinline宣言無しで書いたら,絶対inlineにはなりません.というより,されたら困る.
          • [1013] Re4: 最近使ったファイル - テスト やざき 2001年12月25日 18:06

            ▼ げんたさん
            > >> singletonにする必要性はない.
            > >じゃぁどこにCMRUを置きます?
            > 使いたいときに変数を宣言して,いらなくなったら or スコープから外れたらおしまい.全体で共通の実体を持つ必要はありません.

            をを。鋭いですね。そりゃそうだ。
            修正します!

            > >> * Length()のように明らかに1行しかないような関数はclass定義に書いてinline展開させた方がいいと思います.
            > >趣味の範囲のような。いまどきコンパイラでやってくれてるのでは?
            > class定義の外側にinline宣言無しで書いたら,絶対inlineにはなりません.というより,されたら困る.

            がーん。そうだったのか。すっかりinline展開って勝手にやってくれるものと思ってました。
            じゃーclass定義に書き写しときます。

            感謝感謝。
    • [1030] 気づいたこと 12/27 げんた 2001年12月28日 10:36

      どうもファイルサイズが大きいと思ったらsakuraフォルダに中間ファイル(1.2MB)が入っていた.

      --
      HMENU CreateMenu( class CMenuDrawer* pCMenuDrawer );

      引数は CMenuDrawer& の方がいいんじゃない?いちいち&をつけて呼び出すのも前時代的な感じがする.
      あと,Cと違って構造体やclassを使うときにstruct/classと書く必要はないので,ここの"class"はいりませんね.
      GetFileInfoのstructも.

      --
      ヘッダに移すと言ったLength()が直っていない.

      --
      CMRUとCMRUFolderみたいな二卵性双生児みたいなクラスは間違いの元.
      しかも,片方だけコメントが削除されていたりと微妙に違うのが謎.

      CMRU
      |
      △
      |
      CMRUFile, CMRUFolder
      みたいにできないかなぁ.

      継承にしても今のコードをそのまま使ったのでは無意味なので,共通処理,例えば
      * &を&&に置換
      * MRUに登録
      とかいうのをCMRUのメソッドにして,それを利用するようにする.

      あと,全体の処理の流れが酷似しているけどアクセス先が異なるようなものは個別クラスに依存する部分をprotectedな仮想関数にして,大きな流れを共通化した上で詳細部分はその関数を呼ぶstrategy patternをうまく使えないものだろうか.
      ---
      GetPathのエラー時の戻り値は0じゃなくてNULLがいいな.

      ---
      新規に作った関数には全て,何を渡すと何が行われて何が戻ってくるかがわかるようなコメントを入れて欲しいですね.あとから変更する人が一苦労.
      • [1031] Re: 気づいたこと 12/27 げんた 2001年12月28日 10:46

        >strategy pattern
        変数のアクセス先だけが異なるものにこれを使うと,値を見るだけでも仮想関数呼び出しになって非効率.
        どうしても別関数に切り出せない場合にはこういう手法はどうだろうか.
        1. スーパークラスに必要な変数へのポインタ(protected)を用意する.
        2. サブクラスのコンストラクタで,ポインタを適切に設定.
        3. スーパークラスの関数内では予め設定されたポインタを使う.

        と思ったら,なんとMRUFileとMRUFolderで型が異なるじゃないか!むむぅ.
        m_nMRUArrNum_MAXとm_nOPENFOLDERArrNum_MAX位にしか使えないな.

        --
        でも,よく見たら上の記事で例に挙げたMRU登録と&の展開くらいしか共通部分はないな.それとコンストラクタ.
      • [1032] Re:気づいたこと 12/27 やざき 2001年12月28日 11:34

        やー、批判ばかりはつらいですな。

        ▼ げんたさん
        > どうもファイルサイズが大きいと思ったらsakuraフォルダに中間ファイル(1.2MB)が入っていた.

        ありゃ、しつれい。

        > --
        > HMENU CreateMenu( class CMenuDrawer* pCMenuDrawer );
        >
        > 引数は CMenuDrawer& の方がいいんじゃない?いちいち&をつけて呼び出すのも前時代的な感じがする.
        > あと,Cと違って構造体やclassを使うときにstruct/classと書く必要はないので,ここの"class"はいりませんね.
        > GetFileInfoのstructも.

        まぁそもそも、ソース全体が前時代的な雰囲気なので、そっちを直してから
        文句をいってくれって感じですが :-(

        > --
        > ヘッダに移すと言ったLength()が直っていない.

        inlineをつけた。


        > --
        > CMRUとCMRUFolderみたいな二卵性双生児みたいなクラスは間違いの元.
        > しかも,片方だけコメントが削除されていたりと微妙に違うのが謎.

        思い付きです。気になったら直してください :-)


        > CMRU
        > |
        > △
        > |
        > CMRUFile, CMRUFolder
        > みたいにできないかなぁ.
        >
        > 継承にしても今のコードをそのまま使ったのでは無意味なので,共通処理,例えば
        > * &を&&に置換
        > * MRUに登録
        > とかいうのをCMRUのメソッドにして,それを利用するようにする.
        >
        > あと,全体の処理の流れが酷似しているけどアクセス先が異なるようなものは個別クラスに依存する部分をprotectedな仮想関数にして,大きな流れを共通化した上で詳細部分はその関数を呼ぶstrategy patternをうまく使えないものだろうか.

        考えてみてください :-)


        > ---
        > GetPathのエラー時の戻り値は0じゃなくてNULLがいいな.

        手元では修正しましたん。

        > ---
        > 新規に作った関数には全て,何を渡すと何が行われて何が戻ってくるかがわかるようなコメントを入れて欲しいですね.あとから変更する人が一苦労.

        へーい。考えときます。
        • [1033] Re2:気づいたこと 12/27 やざき 2001年12月28日 11:40

          と、怒りに任せて書いたものの、反省。


          ▼ やざきさん
          > > --
          > > HMENU CreateMenu( class CMenuDrawer* pCMenuDrawer );
          > >
          > > 引数は CMenuDrawer& の方がいいんじゃない?いちいち&をつけて呼び出すのも前時代的な感じがする.
          > > あと,Cと違って構造体やclassを使うときにstruct/classと書く必要はないので,ここの"class"はいりませんね.
          > > GetFileInfoのstructも.
          >
          > まぁそもそも、ソース全体が前時代的な雰囲気なので、そっちを直してから
          > 文句をいってくれって感じですが :-(

          この辺は陳謝。すんません。
          こんごともどうぞよろしく。では~。
        • [1034] Re:気づいたこと 12/27 げんた 2001年12月28日 12:18

          >> ヘッダに移すと言ったLength()が直っていない.
          >
          >inlineをつけた。
          inlineならヘッダファイルに移動しないと他のファイルがコンパイルできないはずなんですが...
          だって,展開しようにも中身がわからないじゃない.

          でも,エラーにならないとすれば自分のクラス内でしか使われていないのかな?
          それならそれでいいけど他のファイルからは使えませんね.
          • [1039] Re2:気づいたこと 12/27 やざき 2001年12月28日 14:55

            ▼ げんたさん
            > >> ヘッダに移すと言ったLength()が直っていない.
            > >
            > >inlineをつけた。
            > inlineならヘッダファイルに移動しないと他のファイルがコンパイルできないはずなんですが...
            > だって,展開しようにも中身がわからないじゃない.
            >
            > でも,エラーにならないとすれば自分のクラス内でしか使われていないのかな?
            > それならそれでいいけど他のファイルからは使えませんね.

            ヘッダのほうにもinlineをつけるべき?
            よくわからないので、げんたさんよろしくです(^^;
            • [1042] Re3:気づいたこと 12/27 やざき 2001年12月29日 00:12

              ▼ やざきさん
              > ▼ げんたさん
              > > >> ヘッダに移すと言ったLength()が直っていない.
              > > >
              > > >inlineをつけた。
              > > inlineならヘッダファイルに移動しないと他のファイルがコンパイルできないはずなんですが...
              > > だって,展開しようにも中身がわからないじゃない.
              > >
              > > でも,エラーにならないとすれば自分のクラス内でしか使われていないのかな?
              > > それならそれでいいけど他のファイルからは使えませんね.
              >
              > ヘッダのほうにもinlineをつけるべき?
              > よくわからないので、げんたさんよろしくです(^^;

              ああ、確かにRelease版はコンパイルできない。
              ので、手元ではinlineとっちゃった(はじめに戻る(苦笑))