Skip to content
This repository has been archived by the owner on Apr 12, 2023. It is now read-only.

Refactoring/optimization (#114) #151

Merged
merged 15 commits into from
Jul 15, 2021

Conversation

Takym
Copy link
Contributor

@Takym Takym commented May 4, 2021

Issue 番号 / Issue ID

目的 / Purpose

  • 使われていないコードを一部削除しました。
  • Android でのみ利用されているクラスを移動しました。
  • JSON 関連で冗長な関数を削除しました。

破壊的変更をもたらしますか / Does this introduce a breaking change?

[x] Yes
[ ] No

Pull Request の種類 / Pull Request type

[ ] Bugfix
[ ] Feature
[ ] Code style update (formatting, local variables)
[x] Refactoring (no functional changes, no api changes) (API は一部変更されています)
[ ] Documentation content changes
[ ] Other... Please describe:

検証方法 / How to test

コードの入手 / Get the code

git clone https://github.com/Takym/cocoa
cd cocoa
git checkout refactoring/optimization
dotnet restore

コードの検証 / Test the code


確認事項 / What to check

  • 正しく動作する。

その他 / Other information

プロジェクトファイルの DefineConstantsREMOVE を指定するとおおよそ元の状態に戻ります。

@Takym Takym changed the title Refactoring/optimization Refactoring/optimization (#114) May 4, 2021
Copy link
Collaborator

@keiji keiji left a comment

Choose a reason for hiding this comment

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

ありがとうございます。
まず、masterとの違いを確認したいのであればブランチ切り替えで対応できるので、ifディレクティブで切り替え可能にしなくてもいいかなと思いました。

リファクタリングという観点からは、不要な記述は削除してしまった方がすっきりしますし、C#の流儀をよくわかっていないのですが、プリプロセッサディレクティブは可読性を落とすイメージがあり、可能な限り使いたくないという気持ちがあります。

AndroidExtensionsはAndroidでしか使わないのでと言うのはご指摘の通りです。いっそファイル名もExtensions.csに変えてしまってもいいかもしれません。

@Takym
Copy link
Contributor Author

Takym commented May 4, 2021

#if REMOVED#if !REMOVED は全て削除しました。REMOVED は元のコードに素早く切り替える為に残しておきましたが、不要との事でしたので削除しました。

また、AndroidExtensionsDiagnosisSubmissionParameter に対する操作を行っているので DSPExtensions に改名しました。DSPExtensions で公開している関数は GetAndroidNonce のみであり、 DeviceCheckService.VerifyAsync からのみ参照されているので、全て DeviceCheckService へ移動してもいいのかもしれません。

Copy link
Collaborator

@keiji keiji left a comment

Choose a reason for hiding this comment

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

確認しました。
いくつかレビューで指摘しましたが、基本的に不要コードの削除とJsonConvertの展開で挙動やテストの範囲が大きく変わると言ったことはなさそうだなと思いました。

今日あたりにユニットテストと、iOSでのビルドチェックしてみます。

Covid19Radar/Covid19Radar.Android/DSPExtensions.cs Outdated Show resolved Hide resolved
Covid19Radar/Covid19Radar.Android/DSPExtensions.cs Outdated Show resolved Hide resolved
Covid19Radar/Covid19Radar/Common/Utils.cs Show resolved Hide resolved
Covid19Radar/Covid19Radar/Common/Utils.cs Outdated Show resolved Hide resolved
Covid19Radar/Covid19Radar/Common/Utils.cs Outdated Show resolved Hide resolved
@keiji
Copy link
Collaborator

keiji commented May 5, 2021

iOSとAndroidでビルドチェックしました。
将来的にはユニットテストも書きたいですね。

`DiagnosisSubmissionParameterExtensions` を `DeviceCheckService` に結合
Copy link
Collaborator

@keiji keiji left a comment

Choose a reason for hiding this comment

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

LGTM

@keiji keiji requested a review from cocoa-dev May 6, 2021 01:03
@@ -42,5 +34,31 @@ async Task<string> GetSafetyNetAttestationAsync(byte[] nonce)
using var response = await client.AttestAsync(nonce, AppSettings.Instance.AndroidSafetyNetApiKey);
return response.JwsResult;
}

public static byte[] GetNonce(DiagnosisSubmissionParameter submission)
Copy link
Contributor

Choose a reason for hiding this comment

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

[質問] GetNonce を Public にしている理由は何故ですか?

Copy link
Contributor Author

@Takym Takym May 14, 2021

Choose a reason for hiding this comment

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

元々 public だったものをそのまま引き継いだ為です。元は別のプロジェクトに入っていたので public になっていたのだろうと思います。また、外部に公開しておけば単体テスト処理も書き易いでしょう。(この PR はリファクタリングが目的ですので、ここでは単体テストは書いていません)

Copy link
Collaborator

Choose a reason for hiding this comment

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

せっかく指摘いただきましたし、このあたりはprivateにしておきましょうか。
単体テスト処理を書く必要が出てきたらアクセスコープを見直しましょう。個人的にテストはpublicなメソッドだけで良いと思っているので、DeviceCheckの先をモック化してテストを書くことになるかと思います。

もしこれらのメソッドが壊れやすいもので、テストの柔軟性を最大限確保するなら、このあたりは別のstaticクラスにして置いておくのも一案と思います(それをすると元に戻すことになるのですが…

Copy link
Contributor Author

Choose a reason for hiding this comment

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

GetNonce を修正し、付け加えて GetSafetyNetAttestationAsyncprivate static を書き加えました。

@keiji keiji changed the base branch from master to develop June 7, 2021 07:21
@Takym
Copy link
Contributor Author

Takym commented Jun 7, 2021

@cocoa-devさん、@keijiさん、@heykuroさん、@halskさん

8052045 にて新しいクラス DateTimeUtility が作成されています。これはテストの為に作成されたと思われますが、この PR で削除すべきでしょうか?もしくは、別の PR にてサービス化した方が良いのでしょうか?現在はサービスになっておらず、静的変数を書き換える事で他のクラスへインスタンスを注入しています。

@Takym
Copy link
Contributor Author

Takym commented Jun 7, 2021

https://github.com/Takym/cocoa/tree/refactoring/optimization2 にて更にリファクタリングを行いました。必要であればこのPRへマージします。

@keiji keiji self-requested a review June 11, 2021 02:13
Copy link
Collaborator

@keiji keiji left a comment

Choose a reason for hiding this comment

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

コンフリクトの解消お願いします!

@keiji
Copy link
Collaborator

keiji commented Jun 11, 2021

ご指摘の DateTimeUtility、テストの時にInstanceを差し替えてダミーの日付を取得するのに使っているんですね。

これはこのままでも動きますが、統一感を考えれば他のServiceと合わせてmockRepositoryから取得する方がきれいですね。ただ、そこまでする必要性があるかと言われると…個人的には迷っていますが、対応するとしても別途にした方が良さそうです。

optimization2 ありがとうございます。そちらはこのPRに依存がないようであれば別Pull Requestでいきましょう!

@Takym Takym mentioned this pull request Jun 11, 2021
1 task
@Takym
Copy link
Contributor Author

Takym commented Jun 11, 2021

#222 にて新しいPRを建てました。

@Takym
Copy link
Contributor Author

Takym commented Jun 11, 2021

本来は新しく Issue を作成してから言うべきですが、DateTimeUtility.Instance は外部から簡単に書き変える事ができるので不具合の原因になりそうです。#223#224 にて Issue と PR を作成しました。

@keiji
Copy link
Collaborator

keiji commented Jun 14, 2021

コンフリクト解消お願いしますー

@Takym
Copy link
Contributor Author

Takym commented Jun 14, 2021

解消しました。

@keiji keiji self-requested a review June 14, 2021 03:38
return GetSafetyNetAttestationAsync(nonce);
}

/// <summary>
/// Verification device information required for positive submissions
/// </summary>
/// <returns>Device Verification Payload</returns>
async Task<string> GetSafetyNetAttestationAsync(byte[] nonce)
private static async Task<string> GetSafetyNetAttestationAsync(byte[] nonce)
Copy link
Contributor

Choose a reason for hiding this comment

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

@Takym
質問のみですが、staticに変えた理由はありますか?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Visual Studio から static にして仮想化呼び出しを避ける様警告されたためです。

Copy link
Contributor

Choose a reason for hiding this comment

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

@Takym
私の環境(Mac)では警告が表示されずどのような意味を持った警告なのかわかりませんでした。
すみませんがその警告がどのような意味か教えていただいてもよろしいでしょうか?

Copy link
Collaborator

Choose a reason for hiding this comment

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

そのメソッドがクラスのインスタンスに依存しないのであれば、staticを指定することで「インスタンスに依存しないこと」を明示できることに加えて、コンパイラがinline展開できるので実行パフォーマンスが上がったりして都合が良い。という話だと記憶しています。

少し前の情報ですが、それっぽい記事を見つけました。
https://ufcpp.net/blog/2018/12/devirtualization/

Copy link
Contributor Author

Choose a reason for hiding this comment

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

static を付け静的関数にした場合、コンパイラは直接関数を呼び出す様にコードを生成します。
static を外し動的関数にした場合、コンパイラは関数を仮想呼び出しするコードを生成します。

最近の Visual Studio では静的関数に変更できる関数は極力変更するよう警告を出してくれる様になりました。

また、static を付ければ動的メンバーを参照しないという意思表示にもなります。

参考

Copy link
Contributor

Choose a reason for hiding this comment

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

ありがとうございます
私自身がstaticを積極的に使ってこなかったというのもあり疑問に思ってしまいました。
腹落ちしました。

@cocoa-dev
Copy link
Contributor

すみませんがコンフリクトの解消もお願いします

@Takym
Copy link
Contributor Author

Takym commented Jul 15, 2021

コンフリクト解消しました。

@keiji keiji merged commit 6a563f3 into cocoa-mhlw:develop Jul 15, 2021
This was referenced Sep 8, 2021
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants