Ich habe ein .net-API-Backend für mobile Apps und die Frage wurde (im Gespräch mit dem iOS-Entwickler) gestellt, ob eine JSON-Antwort für eine leere GUID sollte Folgendes zurückgeben:
- 00000000-0000-0000-0000-000000000000
- oder null (indem der Rückgabetyp nullable Guid-Typ (Guid?)
In C # würden Sie einfach
if (guid == Guid.Empty)
Aber der iOS-Entwickler spricht über das Erstellen einer Parsing-Methode (also vermutlich nicht eingebaut).
Aber ich Ich kann keine Diskussion darüber finden, was als „Best Practice“ angesehen wird oder wie native Apps mit leeren / null Guid umgehen.
Ich weiß Was ich gerne mache, aber was denkst du sollte ich tun?
Kommentare
- Erstens, was ‚ tut er, wenn es ‚ s nicht ist eine leere GUID? Warum benötigt er eine Analysemethode für leere, aber keine nicht leere GUID? Kann ‚ nicht einfach eine Gleichheitsprüfung für die Zeichenfolge “ 00000000-0000-0000-0000-000000000000 ?
- Leere Guid unterscheidet sich von nicht vorhandenen Guid. Auf jeden Fall lautet die Konvention von leer in .Net 00 …. 00, aber Sie möchten diese Konvention möglicherweise nicht an eine öffentliche API weitergeben, die ‚ von anderen Plattformen verwendet wird. Anstatt zu definieren, was ‚ leer ist und was ‚ nicht, müssen Sie die Bedeutung von Guid definieren Verwenden Sie eine Konvention, die für alle Plattformen (Web, IOS, Android usw.) einfach ist, und behalten Sie sie als Protokoll bei.
- @Machado Nun, ist es eine .net-Konvention? “ Die “ nil “ UUID, ein Sonderfall, ist die UUID “ en.wikipedia.org/wiki/Universally_unique_identifier#Standards
- Ich vermute, .Net hat nur Guid Leer, da es in der Version 1.0 keine Generika und keine Nullable gab < T >, so dass Empty zu einem Ersatz für Null wurde. da Guid ein Werttyp ist, aber eigentlich kein gültiger Guid-Wert. In der Codebasis, in der ich heute arbeite, gibt es aus irgendeinem Grund überall Guid? S, und sowohl leer als auch null bedeuten semantisch dasselbe. Es ist ziemlich ärgerlich und ich ‚ habe die Guid ‚ nicht nullbar gemacht, also habe ich ‚ muss nicht beide Fälle überprüfen, aber das ‚ ist nur, weil es ‚ jetzt möglich ist, Guid loszuwerden .Empt.
- Es gibt ‚ einen wichtigen Unterschied zwischen einem “ leeren “ konstant und null: Eine verursacht NREs und die andere wird ‚ t. Beide müssen überprüft und gehandhabt werden, also wählen Sie Ihr Gift. Möchten Sie schnell oder lautlos versagen?
Antwort
Eine „leere“ Guid ist immer noch eine gültige Guid Das Parsen sollte also keine zusätzliche Logik erfordern.
Die Frage ist, warum Sie es überhaupt verwenden? Es scheint mir ein Fehler zu sein, einer bestimmten Anleitung eine besondere Bedeutung zuzuweisen, was es zu einer Magie macht number.
Es ist ein bisschen so, als würde ich sagen, dass ich eine int-ID zurückgeben werde, aber wenn es negativ ist, ist es ein Fehlercode. Tu es nicht!
Der Grund dafür ist, dass der Benutzer bei jedem Aufruf Ihrer Funktion daran denken muss, nach einem negativen Rückgabewert zu suchen. Wenn sie es vergessen, kommt es zu einer Katastrophe.
Wenn Sie guid.empty eine spezielle Bedeutung zuweisen, muss jeder, der Ihre API aufruft, nach jedem Aufruf eine spezielle Prüfung schreiben.
Es “ Es ist besser, null zurückzugeben (falls zutreffend) oder eine Ausnahme auszulösen (über einen HTTP-Fehlercode, unter der Annahme eines REST-Dienstes).
Kommentare
- weil Eines Tages werden Sie einen Warncode oder einen Fehler 504.2 haben und nicht in der Lage sein, ihn in eine negative Ganzzahl oder eine negative ID zu quetschen, und das gesamte System wird zusammenbrechen.
- Es ist eine kleine Seite Issue wirklich. guid.empty (wie jede andere spezifische Guid) wird niemals generiert.
- OP hat ‚ t keine spezielle Bedeutung zugewiesen bis 00..00 hat das .Net-Team dies getan. Die Frage ist, ob diese Abstraktion auslaufen soll oder nicht.
- @RubberDuck: Die Null-UUID ist tatsächlich Teil des RFC, der die UUID beschreibt, also hat die Abstraktion “ ist bereits durchgesickert „. ref tools.ietf.org/html/rfc4122#section-4.1.7
- Nun, @Newtopian, wenn es ‚ Teil des RFC ist, finde ich es völlig akzeptabel, es in einer API-Antwort zurückzugeben. Wenn die Sprache / Bibliothek des Clients ‚ keine ‚ keine Konstante dafür definiert, ‚ ist einfach genug, um eine zu erstellen und entsprechend zu behandeln.
Antwort
Ich bin ein iOS-Entwickler und Ich habe keine Ahnung, warum Ihr Typ glaubt, er müsse „eine Analysemethode“ erstellen. UUID(uuidString: valueFromServer)
ist alles, was er tun muss. Er kann Ihre magische UUID erstellen, indem er einfach:
extension UUID { static var zero: UUID { return UUID(uuidString: "00000000-0000-0000-0000-000000000000")! } }
Dann kann er jede GUID mit dieser magischen GUID vergleichen.
Das heißt, für alle Werte, die vom Server stammen, muss der Frontend-Entwickler zuerst Überprüfen Sie, ob der Wert vorhanden ist. Überprüfen Sie dann, ob er gut geformt ist (vom richtigen Typ). Wenn Sie einen magischen Wert zurückgeben, muss er auch überprüfen, ob der Wert vorhanden ist richtig eingegebener Wert ist Magie. Indem Sie den magischen Wert einbeziehen, zwingen Sie ihn, eine zusätzliche if-Prüfung durchzuführen.
Als Frontend-Entwickler muss ich fragen: Aus welchem Grund zwingen Sie mich, die Komplexität meiner App zu erhöhen?
Wenn Sie argumentieren können, dass das Frontend eine fehlende GUID anders als die magische GUID behandeln soll, haben Sie ein Argument für die Rückgabe. Andernfalls fügen Sie der Frontend-App unnötige Komplexität hinzu.
(Hinzufügung als Antwort auf den Kommentar von @RubberDuck.)
Hier ist die Sache. Der JSON-Standard hat eine Möglichkeit, mit Nullwerten umzugehen, und der GUID-Standard hat eine andere Art, mit Nullwerten umzugehen. Da Sie eine GUID über JSON senden, handelt es sich bei letzterem um das übergeordnete Problem (da die GUID in JSON eingeschlossen wird). Dies ist der Standard, dem Sie entsprechen sollten. Denn selbst wenn Sie sich entscheiden, eine Null-GUID zu senden, indem Sie tatsächlich eine GUID voller Nullen senden, muss das Frontend immer noch nach der JSON-Null suchen.
Erzwingen Sie das Front-End nicht, sich mit zwei verschiedenen Nullkonzepten zu befassen.
Kommentare
- Weil es ‚ Teil des RFC? tools.ietf.org/html/rfc4122#section-4.1.7
- Oh, die Freuden der zufälligen Komplexität. Ich muss meine App komplexer machen, weil ein RFC-Komitee eine Wahl getroffen hat, die in meinem System keinen Sinn ergibt.
- Nein, Sie machen Ihre App so komplexer dass Ihr System flexibler wird, indem Sie einen genau definierten Standard akzeptieren. Wenn Ihre Bibliotheken den Standard nicht ‚ unterstützen, erheben Sie einen Gestank und bitten sie, ihn vorgelagert zu beheben.
- Oder Sie ändern den Standard, weil er ‚ dumm ist. Magische Werte sind die schlechtesten. Als nächstes ist ein RFC, der einen int-Wert von 0 angibt, tatsächlich NULL ?
Antwort
Machen Sie, was Sie möchten (was MacOS und iOS betrifft).
Das iOS oder MacOS wird entwickelt r schreibt eine Analysemethode, die prüft, ob Ihre JSON-Daten eine Zeichenfolge enthalten, und diese in ein GUID-Objekt umwandelt oder auf einen Fehler hinweist. Wenn Sie eine JSON-Null senden, um eine nicht vorhandene Guid anzugeben, wird auch geprüft, ob die JSON-Daten einen NSNull () -Wert enthalten. Dies setzt voraus, dass der Entwickler nicht völlig inkompetent ist. Darüber hinaus verwenden sie je nach Präferenz entweder optionale GUIDs und suchen nach Null oder nicht optionale GUIDs und verfügen über eine Eigenschaft, die prüft, ob eine GUID nur aus Nullen besteht. Das ist völlig unabhängig von dem, was Sie tun.
Im Ernst, Sie können tun, was Sie wollen (halten Sie es einfach konsistent). Jeder nicht völlig inkompetente Entwickler wird in Ordnung sein. „Erstellen einer Parsing-Methode“ ist Dies ist sehr einfach zu bewerkstelligen. Wie die meisten iOS-Entwickler ist dies nicht einmal eine Diskussion wert. Dokumentieren Sie, was Sie senden. Ich werde eine Analysemethode schneller erstellen, als es unsere Diskussion dauern würde.
Kommentare
- Ja, ich stimme Ihnen zu, ich kontrolliere, was zu tun ist. und ich werde es tun. Und ich weiß, dass der iOS-Entwickler im Handumdrehen einen Parser erstellen wird. Aber ist das die richtige Antwort? Ich hatte auf eine solidere Antwort gehofft. Aber vielleicht gibt es ´ t one. Ich ´ lasse dies für eine Weile marinieren und gebe Ihnen dann die Antwort, es kommt nichts Besseres.
Antwort
Da in .NET Guid ein Werttyp ist, kann ihm der Wert null nicht zugewiesen werden.
Wenn Nullen in Werttypen gespeichert werden müssen Die normale Lösung besteht darin, Nullable zu verwenden oder als Abkürzung die? Syntax wie in Guid? int? long? usw. zu verwenden.
Dies funktioniert auch mit Standard-Serialisierern, sodass der Wert entweder fehlt oder das Literal enthält Nullwert.
Kommentare
- Esben, diese Antwort adressiert nicht OP ‚ s Frage. Bitte schauen Sie sich das genauer an, bevor Sie antworten.