モバイルアプリ用の.netapiバックエンドがあり、

空のGUID は次を返す必要があります:

  • 00000000-0000-0000-0000-000000000000
  • または null (戻り値の型をnull可能なGUID型(Guid?)にすることにより

最初の場合、モバイル開発者はそのための解析メソッドを作成する必要があり、通常の汎用nullチェック関数を使用しないでください。

C#では

if (guid == Guid.Empty) 

しかし、iOS開発者は解析メソッドの作成について話します(したがって、組み込みではないと思います)。

しかし、私は「ベストプラクティス」と見なされるものや、ネイティブアプリが空/ヌルのGUIDをどのように処理しているかについての議論は見つかりません。

わかっています私は何をしたいのですが、私は何をすべきだと思いますか?

コメント

  • まず、'そうでない場合に'何をしますか空のGUID?また、なぜ彼は空ではなく空でないGUIDの解析メソッドを必要とするのですか? '文字列" 00000000-0000-0000-0000-000000000000 ?
  • 空のGUIDは、存在しないGUIDとは異なります。 .Netでの空の規則は必ず00 …. 00ですが、他のプラットフォームで使用されている'のパブリックAPIにこの規則を漏らしたくない場合があります。 'が空で何が'でないかを定義する代わりに、GUIDがある場合とない場合の意味を定義する必要があります。 、すべてのプラットフォーム(Web、IOS、Androidなど)で簡単な規則を使用し、それをプロトコルとして保持します。
  • @Machadoそれは.netの規則ですか? " " nil " UUIDは、特殊なケースで、UUID " en.wikipedia.org/wiki/Universally_unique_identifier#Standards
  • .NetにはGUIDしかないと思います.1.0リリースでは、ジェネリックとNullable < T >がなかったため、Emptyはnullを意味する代役になりました。 Guidは値型ですが、実際には有効なguid値ではないためです。私が今日働いているコードベースでは、何らかの理由でどこにでもGuidがあり、Emptyとnullの両方が意味的に同じことを意味します。かなり面倒で、'がGuid 'をnull不可にしたので、'両方のケースをチェックし続ける必要はありませんが、'は、Guidを取り除く方法が'あるためです。 .Empty。
  • ' "空の"定数およびnull:1つはNREを引き起こし、もう1つは' tを引き起こします。両方ともチェックして処理する必要があるので、毒を選んでください。速く失敗したいですか、それとも黙って失敗したいですか?

回答

「空の」GUIDは引き続き有効なGUIDです、したがって、解析に追加のロジックは必要ありません。

問題は、なぜそれを使用するのかということです。特定のGUIDに特別な意味を割り当てて、魔法にするのは間違いのようです。番号。

int idを返すと言っているようなものですが、負の場合はエラーコードです。実行しないでください!

..その理由は、関数を呼び出すたびに、ユーザーが負の戻り値を確認することを忘れないようにする必要があるためです。忘れると災害が発生します。

同様に、guid.emptyに特別な意味を割り当てると、APIを呼び出すすべての人が、呼び出すたびに特別なチェックを作成する必要があります。

It ” s nullを返す(適切な場合)か、例外をスローする(RESTサービスを想定したHTTPエラーコードを介して)方がよいでしょう。

コメント

  • ある日、警告コードまたはエラー504.2が発生し、それを負の整数または負のIDに圧縮できなくなり、システム全体が崩壊します
  • 少し面があります本当に発行します。guid.empty(他の特定のguidと同様)は生成されません
  • OP didn ' t 特別な意味を割り当てます00..00まで、.Netチームはそうしました。問題は、この抽象化をリークさせるかどうかです。
  • @RubberDuck:nil UUIDは、実際にはUUIDを記述するRFCの一部であるため、抽象化にはすでに"リーク"。ref tools.ietf.org/html/rfc4122#section-4.1。7
  • それがRFCの'の一部である場合、@ Newtopianは、API応答で返すことは完全に許容できると思います。クライアントの'の言語/ライブラリが'定数を定義していない場合は、'は、作成して適切に処理するのに十分シンプルです。

回答

私はiOS開発者であり、なぜあなたの男が「解析メソッド」を作成する必要があると思うのかわかりません。UUID(uuidString: valueFromServer)は彼がする必要があるすべてです。彼は簡単にあなたの魔法のUUIDを作成できます:

extension UUID { static var zero: UUID { return UUID(uuidString: "00000000-0000-0000-0000-000000000000")! } } 

次に、任意のGUIDをこの魔法のGUIDと比較できます。

とはいえ、サーバーからのすべての値について、フロントエンド開発者は最初に値がそこにあるかどうかを確認してから、それが(適切なタイプの)整形式であるかどうかを確認します。魔法の値を返す場合は、またチェックして正しく入力された値は魔法です。魔法の値を含めることで、チェックする場合は追加を強制することになります。

フロントエンド開発者として、次の質問をする必要があります。アプリの複雑さを増すように強制する理由は何ですか。

フロントエンドが欠落しているGUIDを魔法のGUIDと異なる方法で処理する必要があるという議論をすることができれば、それを返すための議論があります。そうしないと、フロントエンドアプリに不必要な複雑さが加わります。


(@ RubyDuckのコメントに応じて追加します。)

これが問題です。 JSON標準にはnull値を処理する1つの方法があり、GUID標準にはnull値を処理する別の方法があります。 GUIDを JSON経由で送信しているため、後者は包括的な懸念事項です(GUIDはJSONでラップされているため)、これは準拠する必要のある標準です。 。実際にゼロでいっぱいのGUIDを送信してnullGUIDを送信することにした場合でも、フロントエンドはまだ JSONnullをチェックする必要があります。

フロントエンドにnullの2つの異なる概念を処理させないでください。

コメント

  • なぜなら' RFCの一部ですか? tools.ietf.org/html/rfc4122#section-4.1.7
  • 偶然の複雑さの喜び。RFC委員会が私のシステムでは意味をなさない選択をしたため、アプリをより複雑にする必要があります。
  • いいえ、アプリをより複雑にします。明確に定義された標準を受け入れることで、システムがより柔軟になります。また、ライブラリが標準をネイティブにサポートしていない場合は、悪臭を放ち、上流で修正するように依頼します。' / li>
  • または、'が馬鹿げているため、標準が変更されます。マジック値は最悪です。次に、int値0を示すRFCは実際にはNULLです。 ?

回答

好きなことをしてください(MacOSとiOSに関する限り)。

iOSまたはMacOSが開発rは、JSONデータに文字列が含まれているかどうかをチェックし、それをGUIDオブジェクトに変換するか、何らかの理由で失敗を示す解析メソッドを記述します。存在しないGUIDを示すためにJSONnullを送信すると、JSONデータにNSNull()値が含まれているかどうかもチェックされます。それは、開発者が完全に無能ではないことを前提としています。さらに、好みに応じて、オプションのGUIDを使用してnilをチェックするか、オプション以外のGUIDを使用してGUIDがすべてゼロかどうかをチェックするプロパティがあります。それは「あなたがしていることとは完全に独立しています。

真剣に、あなたは好きなことをすることができます(一貫性を保つだけです)。完全に無能な開発者でなくても大丈夫です。「解析方法の作成」は非常に簡単にできることです。ほとんどのiOS開発者として、これについて議論する価値すらありません。送信する内容を文書化します。 「議論よりも早く解析方法を作成します。

コメント

  • はい、同意します。何をすべきかを制御します。そして、iOS開発者がパーサーを簡単に作成することを知っています。しかし、これは正しい答えですか?もっと確実な答えを望んでいました。しかし、おそらく´ t one。I ´しばらくの間これをマリネートさせてから、答えを出します。

回答

.NET Guidは値型であるため、値nullを割り当てることはできません。

値型にnullを格納する必要がある場合通常の解決策は、Nullableを使用するか、略記としてGuid?int?long?などのような構文を使用することです。

これは標準のシリアライザーでも機能するため、値が欠落しているか、リテラルが含まれます。 null値。

コメント

  • Esben、この回答はOPに対応していません'の質問。回答する前に、詳しく調べてください。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です