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

編集ウインドウへの参照をリファクタリングする #1744

Merged

Conversation

sanomari
Copy link
Contributor

@sanomari sanomari commented Oct 17, 2021

PR の目的

編集ウインドウへの参照を持つクラスから参照メンバを除去し、編集ウインドウがインスタンス生成済みでなくても該当クラスのインスタンスを生成できるようにします。これにより、編集ウインドウは該当クラスをメンバ変数として持つ子ゴアできるようになります。

カテゴリ

  • リファクタリング

PR の背景

サイズボックスの表示・非表示を切り替える修正を準備しています。

修正の過程で #1507 でも提案されているミニマップの分割を検討してみました。
https://github.com/sanomari/sakura-editor/tree/feature/add_cminimapview

現在の編集ビューはインスタンス生成に編集ウインドウのインスタンスを必要とします。

ミニマップは論理的に編集ウインドウのメンバですが、
編集ビューのコードを流用することで描画を実現しているので、編集ビューを継承するクラスとせざるを得ません。
しかし、編集ビューを継承させてしまうとインスタンス生成に編集ウインドウのインスタンスが必要となり、編集ウインドウのメンバとすることができません。

PR のメリット

PR のデメリット (トレードオフとかあれば)

仕様・動作説明

仕様変更・機能追加はありません。

編集ウインドウのポインタをメンバに持つクラスから該当メンバを削除します。
変更により、該当クラスのインスタンスを「編集ウインドウのメンバ」として保持できるようになります。

ミスすると大変なので、修正は可能な限り正規表現のパターン置換で行いました。

PR の影響範囲

サクラエディタのコア部分に関する変更です。
何かミスっていた場合、ビルドが通らなくなったりアプリ起動できなくなったりします。

テスト内容

ソースがビルドできること、ビルドしたアプリが起動できることを確認しました。

テスト1

手順

関連 issue, PR

参考資料

@sanomari sanomari added the refactoring リファクタリング 【ChangeLog除外】 label Oct 17, 2021
@AppVeyorBot
Copy link

Build sakura 1.0.3960 failed (commit 6404e24457 by @sanomari)

@berryzplus
Copy link
Contributor

修正内容に異論はないですが、テストが通らないのはマズいです。

CEditWndのインスタンスはクラスのstatic変数に保持されるので、グローバル変数に持つと二重保持になり無駄です。
@sanomari sanomari force-pushed the feature/fix_reference_of_CEditWnd branch from a424ce5 to 4b341c4 Compare October 17, 2021 14:44
@sonarcloud
Copy link

sonarcloud bot commented Oct 17, 2021

SonarCloud Quality Gate failed.    Quality Gate failed

Bug C 7 Bugs
Vulnerability A 0 Vulnerabilities
Security Hotspot A 0 Security Hotspots
Code Smell A 24 Code Smells

38.2% 38.2% Coverage
1.3% 1.3% Duplication

@AppVeyorBot
Copy link

Build sakura 1.0.3961 completed (commit 94adbd584e by @sanomari)

@sanomari sanomari marked this pull request as draft October 18, 2021 00:27
@sanomari
Copy link
Contributor Author

SonarCloud対応をやりかけましたが、サイズボックスの整理をしてから対応したほうが分かりやすそうなのであえてすべて放置します。

@sanomari sanomari marked this pull request as ready for review October 18, 2021 09:38
Copy link
Contributor

@berryzplus berryzplus left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bugs7件を見なかったことにすれば問題なさそうです。
このPRの変更によって発生したBugsではないので「スルー可」と判断します。

@@ -89,7 +89,7 @@ bool CAutoReloadAgent::_ToDoChecking() const
if(hwndActive!=CEditWnd::getInstance()->GetHwnd())return false;
if(!GetListeningDoc()->m_cDocFile.GetFilePathClass().IsValidPath())return false;
if(GetListeningDoc()->m_cDocFile.IsFileTimeZero()) return false; /* 現在編集中のファイルのタイムスタンプ */
if(GetListeningDoc()->m_pcEditWnd->m_pPrintPreview ) return false; // 印刷プレビュー中 2013/5/8 Uchi
if(GetEditWnd().m_pPrintPreview ) return false; // 印刷プレビュー中 2013/5/8 Uchi
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

89行目にある CEditWnd::getInstance()GetEditWnd() で置換できますね、とか。
92行目の m_pPrintPreview ) の空白がビミョーですね、とか。

突っ込もうとすればいくらでもツッコミどころがありそうです。
今回一応「基本的にパターン置換で対応」ということなので、細かいところはスルーします。

@@ -173,9 +173,5 @@ struct SSearchOption{
bool operator != (const SSearchOption& rhs) const noexcept;
};

//2007.10.02 kobake CEditWndのインスタンスへのポインタをここに保存しておく
class CEditWnd;
extern CEditWnd* g_pcEditWnd;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

とうとう消えるんですね・・・

@@ -39,7 +39,7 @@ inline CEditDoc* CViewCommander::GetDocument()
}
inline CEditWnd* CViewCommander::GetEditWindow()
{
return m_pCommanderView->m_pcEditWnd;
return &GetEditWnd();
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

このメソッド自体も、将来的には消えるべき、と理解しました。
今回は、分かりにくくなるからやらんのでしょうね・・・。

@@ -1045,7 +1045,7 @@ bool IsFuncEnable( const CEditDoc* pcEditDoc, const DLLSHAREDATA* pShareData, EF

// 02/06/26 ai Start
case F_JUMP_SRCHSTARTPOS: // 検索開始位置へ戻る
if( pcEditDoc->m_pcEditWnd->GetActiveView().m_ptSrchStartPos_PHY.BothNatural() ){
if( GetEditWnd().GetActiveView().m_ptSrchStartPos_PHY.BothNatural() ){
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

蛇足と思いますが、グローバル関数CEditView& GetActiveView()があったほうがよいと思います。
この使い方をしている箇所がけっこう多いから。

// /* アクティブなペインを設定 */
// m_pcEditWnd->SetActivePane( m_nMyIndex );
// GetEditWnd().SetActivePane( m_nMyIndex );
// }
// return 0L;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

このコメントアウトコードは削ったら?
という指摘をしようかどうか迷いました。
とりあえず書いておきますが対応は不要です。

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

この流れでCEditViewの修正も予定しています。
既に一括置換じゃない変更も含んでしまってますが、これは除外しておきたいです。

@@ -851,7 +850,7 @@ LRESULT CEditView::DispatchEvent(
// マウスクリックによりバックグラウンドウィンドウがアクティベートされた
// 2007.10.08 genta オプション追加
if( GetDllShareData().m_Common.m_sGeneral.m_bNoCaretMoveByActivation &&
(! m_pcEditWnd->IsActiveApp()))
(! GetEditWnd().IsActiveApp()))
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

指摘じゃないですが、否定演算子の位置がおかしいですね。

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

おかしいですね。
&&の後のカッコも不要という指摘もありえますよね。
面倒なので考えないことにしました。

{
::_com_raise_error(E_FAIL, MakeMsgError(L"Any CEditWnd has been instantiated."));
}
return (CEditWnd&)*pcEditWnd;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

const autoをC style castでconst外ししているため、キャストで強制型変換が可能になっており、もしCEditWnd::getInstance()の部分のコードが、CEditView*とか予期せぬ変な型に変更されたとしても、エラーが検出されなくて、この書き方は若干危険な予感がします。
非constを返すことが確定している以上、pcEditWndはconstで受けずautoだけにしてキャストを削除するか、const_castを使ったほうが安全です。ただconst_castはどうしても取り回しが難しいときに限定的に使うもので、こういうときは前者の対応方法をしたほうがいいと思います。

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

了解しました。
この部分はissue化して別途対応します。

@sanomari
Copy link
Contributor Author

やや課題残ししてますがapproveいただいたのでマージしてしまいます。

@sanomari sanomari merged commit 3b1a659 into sakura-editor:master Oct 19, 2021
@sanomari sanomari deleted the feature/fix_reference_of_CEditWnd branch October 19, 2021 03:26
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
refactoring リファクタリング 【ChangeLog除外】
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants