Upgrade to Pro — share decks privately, control downloads, hide ads and more …

cocone Teck Talk Vol.1 - 大規模リファクタリング

cocone
August 17, 2021

cocone Teck Talk Vol.1 - 大規模リファクタリング

cocos2dx V2 から V3 への道のりとその先のMetalを見据えて
「大規模」リファクタリングでやっておくべきこと

cocone

August 17, 2021
Tweet

More Decks by cocone

Other Decks in Programming

Transcript

  1. やるべきこと/やってよかったこと① 
 関係者へ理解を求めること
 関係者 = 事業の責任者(事業部長、社長、各職種リーダーなど)、CTO、サービスへの決定権を持つ人 
 リファクタリング「する」ことへのリスク 
 リファクタリング「しない」ことへのリスク

    
 計画の共有
 
 このあたりをちゃんと説明すること 
 
 開発以外の人からも計画や 
 人員計画などのアイディアが出る 
 運用中のサービスの大規模リファクタリングとなると影響度が尋 常じゃない!!
 が、やらないと将来的にまずい!!! 

  2. やるべきこと/やってよかったこと② 
 計画は絶えず見直す
 当初の計画
 年末から開発者全員(10人以上)でサービス開発を止めて 
 cocos2dxV2→cocos2dxV4(Metal)へ変更 4ヶ月 
 大きい


    計画変更
 cocos2dxV2→V3へ変更 次の計画変更
 次の年の4月から 次の次の計画
 サービス開発を止めずに対応 次の次の次の計画
 対応メンバーは少数精鋭約4人で
  3. やるべきこと/やってよかったこと② 
 計画は絶えず見直す
 目標
 期間
 チーム体制
 
 全部見直しが必要 
 見直し項目

    特に期間は関係者への共有は必須 (いいづらいけども)  
 最初にとても見積もりきれない
 絶えず見直しと関係者への共有を忘れない
 場合によってはゴールの見直しも必要 

  4. やるべきこと/やってよかったこと③ 
 目標をたてていくこと
 小さい
 ex.
 ・技術課題の管理
 ・TableViewの差し替え、37/149 達成など
 ・Popup画面の対応 50/85
 


    細かくタスクを管理し、達成具合を記載していくこと
 ・普通のプロジェクト以上に見える化が大事、周りから見ると何やってるか分からない 
 ・モチベーションの持続  正直リファクタリングを長時間ひたらすらやるのはツライ 

  5. やるべきこと/やってよかったこと⑤ 
 Debug機能の充実化/開発環境の充実化 
 ・ログ機能
 ・画面レイヤー構造の確認ツール 
 ・アカウントの切り替え機能
 ・アバター確認
 ・UI確認機能


    ・Androidバックキー
 などなど
 マシンを差し替え
 ex.Rizen9マシンにしたらAndroidは2倍
 ex.M1Macもビルド時間の向上に
 ・バグは大量に出るので、原因究明できるようにしておく。今後の役にも立つ
 ・開発速度を早くする工夫。cocos2dxは。。
 ・ビルドマシンは状況によりけりですが、良くできるならすべき

  6. やるべきこと/やってよかったこと⑥ 
 常にマージ/最新の状態を保つこと 
 ・Gitで管理
 
 ・サービス側がリリースされる度にマージ 
 
 ・一度乖離すると非常に難しい


    
 ・ソースコードは意外となんとかなる 
 
 ・Xcodeのプロジェクトファイルが結構厄介 
 マージツールとしてmergepbxを使用 
 XcodeGenも今後検討したいところ 
 

  7. やるべきこと/やってよかったこと⑦ 
 テストできる設計を目指す 
 ・シングルトンの嵐
 ・依存関係がすごい
 ・SOLID原則に反しまくっている
 ・色々な所でベースのLayerクラスをdynamic_castして処理を判断している
 
 ・せめてプラットフォーム部分はinterfaceを分離。


    ・シングルトンではなくサービスロケータに。
 ・DI的にするのは中途半端に終わりさらなるカオスになりそうと判断
 ・画面遷移の仕組みも修正
 
 全部は直せない、何年かかるか分からん!! 

  8. やるべきこと/やってよかったこと⑦ 
 テストできる設計を目指す 
 CP1AssetManager IAssetManager Locator Singleton 注入 Client::funciton{

      CPLocator::AssetManager()->donwload("main_asset"); } Init {   IAssetManager assetManager = CP1AssetManager::getInstance()   CPLocator::provide(assetManager ); } 開発途中ではシングルトン状態とサービスロケータ を同居 Client2::funciton{   CP1AssetManager::getInstance().download("main_asset"); } 開発途中 利用者1
 利用者2

  9. やるべきこと/やってよかったこと⑦ 
 テストできる設計を目指す 
 CP1AssetManager IAssetManager Locator Singleton 注入 Client::funciton{

      CPLocator::AssetManager()->donwload("main_asset"); } Init {   IAssetManager assetManager = new CP1AssetManager()        CPLocator::provide(assetManager ); } Client2::funciton{   CPLocator::AssetManager()->donwload("main_asset"); } 全部置き換えたらSingletonなくす 開発途中
  10. やるべきこと/やってよかったこと⑦ 
 テストできる設計を目指す 
 CP2AssetManager IAssetManager Locator 注入 Client::funciton{   CPLocator::AssetManager()->donwload("main_asset");

    } Init {   IAssetManager assetManager = new CP2AssetManager()        CPLocator::provide(assetManager ); } Client2::funciton{   CPLocator::AssetManager()->donwload("main_asset"); } CP1AssetManager(cocosv2用)を CP2AssetManager(cocosV3用)に差し替え CP1AssetManager
  11. やるべきこと/やってよかったこと⑦ 
 テストできる設計を目指す 
 BaseLayer +restoreMyAvatar() +nativeEventReceive() +block() +unblock() +onMovePlanet()

    +startAvatarIdleAction() +stopAvatarIdleAction() +show() ・・・ Fatなクラス
 ベースのクラスの割に色々と機能が
 詰め込まれている状態

  12. やるべきこと/やってよかったこと⑦ 
 テストできる設計を目指す 
 BaseLayer +show() ・・・ LayerAvatarInterface +restoreMyAvatar() +startAvatarIdleAction()

    +stopAvatarIdleAction() BlockInterface +block() +unblock() PlanetInterface +onMovePlanet 一部しか使っていないものは 具象クラスの方へ移動 PlanetLayer ・・・
  13. やるべきこと/やってよかったこと⑦ 
 テストできる設計を目指す 
 BaseLayer +show() ・・・ LayerAvatarInterface +restoreMyAvatar() +startAvatarIdleAction()

    +stopAvatarIdleAction() BlockInterface +block() +unblock() PlanetInterface +onMovePlanet 使わなくなったものは削除 PlanetLayer ・・・