やあ、
一貫性のないguard
ステートメントがたくさん見られます。 スタイルガイドにguard
ステートメントのセクションを追加できますか?
提案:
1つのステートメント:
guard let name = json["name"] as? String else {
return nil
}
マルチステートメント:
guard let name = json["name"] as? String,
let coordinatesJSON = json["coordinates"] as? [String: Double],
let latitude = coordinatesJSON["lat"],
let longitude = coordinatesJSON["lng"],
let mealsJSON = json["meals"] as? [String]
else {
return nil
}
私はこの提案が好きです....モジュロ2スペース4スペースインデント:]
これについて考え直し始めました。 図書館の著者から、ワンライナーとして警備員を務めることを本当に尊敬している多くの迅速なコードを見てきました。 何か考え@ JRG-開発者@ eskerber @ jawwad @gregheo ?
考えられる妥協案:上記の形式を使用してすべての例を示しますが、それを法制化することはできません。
これが私の考えです:
何よりもまず、印刷/ウェブ/意図されている形式でテキストの見栄えを良くします。 多くの場合、これは、通常はXcodeに返品が含まれていない可能性がある場所に返品を追加することを意味します。
単一ステートメントのガードの場合、私は実際にこれを好みます:
guard let strongSelf = self else { return nil }
私の推論は、メソッドの主な目的が何であれ、それは通常重要ではないということです。 もちろん、必ずそこにいる必要がありますが、このような単純な警備員に3行を無駄にする価値はないと思います。
これは、印刷物やWebなどのテキストを少し短くするのにも役立ちます。これはプラスです。
guard let name = json["name"] as? String,
let coordinatesJSON = json["coordinates"] as? [String: Double],
let latitude = coordinatesJSON["lat"],
let longitude = coordinatesJSON["lng"],
let mealsJSON = json["meals"] as? [String] else { return nil }
ここでの違いは、最後のアンラップと同じ行にelse
を保持することです。
理由は同じです。これは予想されるパスではなく、スペースを無駄にする価値はありません。
Appleから初期フォーマットを借りましたが、コードスタイルも変更しました。 すぐに戻ってくる場合は、ワンライナーを使用するのが合理的です。
新しいバージョンは次のとおりです。
独身:
guard let name = json["name"] as? String else { return nil }
マルチ:
guard let name = json["name"] as? String,
let coordinatesJSON = json["coordinates"] as? [String: Double],
let latitude = coordinatesJSON["lat"],
let longitude = coordinatesJSON["lng"],
let mealsJSON = json["meals"] as? [String]
else { return nil }
let
が複数ある場合、 else
は独自の行に値すると思います。
1行に配置すると、障害の場合にブレークポイントを設定できなくなります。
@rayfixええ、あなたはそれをすることはできません...¯_(ツ)_ /¯
私はこれらのスタイルの両方を試し、使用しましたが、私の好みも1行のオプションになりました。 私の意見では、より簡潔で読みやすいコードを持つことは、どんな不利な点よりも重要です。
しかし、反対する人々がどこから来ているのかはわかります。 言及された問題@rayfix以外に、他に2つの欠点があります。
場合によっては、比較的長くなり、読みにくくなることがあります。 (もっと極端な例を見つけることができると確信しています):
複数行:
guard let meal = Meal(rawValue: string) else {
throw SerializationError.invalid("meals", string)
}
1行:
guard let meal = Meal(rawValue: string) else { throw SerializationError.invalid("meals", string) }
もう1つの問題は、一貫性だけです。 たとえば、1行のif
条件を実行することはありません。
しかし、繰り返しになりますが、私の好みはまだ1行を使用しています。 もう少し岩を回そうとしているだけです。
私の傾向は、これには厳格な規則はないということです。 たぶん、クロージャーチェーンの場合と同じように明示する必要があります。
間隔、改行、および名前付き引数と匿名引数をいつ使用するかについての決定は、作成者の裁量に任されています。
私は、Swift Standard Library、Almofire、Unbox、SwiftyJSON、Springなど、スターの高いSwiftライブラリについて非公式の調査を行いました。 私が見つけることができる本当のコンセンサスはありません。 それらはすべて、独自のコンテキストで私にはかなりよく見えます。
https://developer.apple.com/swift/blog/?id=37のAppleJSONの例でも、同じ関数のさまざまな場所にelse
を配置しています。 それはそれが悪く見えると言っているのではありません。 それは実際に私の目にはよく見えます。
ですから、私は言語が許す柔軟性を受け入れたいという陣営に陥っていると思います。 これは、ある程度の一貫性を犠牲にして、読みやすさ(明確さ)を優先すると思います。
私は間違っている可能性がありますが、この問題のリリースを保持したくありません。 私の目標は、月曜日にチームがドキュメントをレビューして、木曜日にマージできるようにすることです。 あなたがアピールしたいのなら、私はそれで完全にクールです! あなたのケースを(ここに)述べてください。私はそれをチームリードに転送して最終決定を下します。
とにかく、この問題を提起してくれてありがとうございます。それは私にもっと明確さを与え、いくつかの有益な議論と洞察を引き起こしたからです。
最も参考になるコメント
Appleから初期フォーマットを借りましたが、コードスタイルも変更しました。 すぐに戻ってくる場合は、ワンライナーを使用するのが合理的です。
新しいバージョンは次のとおりです。
独身:
マルチ:
let
が複数ある場合、else
は独自の行に値すると思います。