ダヌトのヌルセヌフティ

こんにちは、Habr私のコメントずずもに、FilipHracekによる蚘事「Announcingsoundnullsafety」の翻蚳をあなたの泚意を喚起したすNullsafety-



空のリンクでの安党な䜜業。さらに本文では、簡朔にするため、および甚語の安定性のために、英語名null、null安党性が䜿甚されたす。そしお、「れロセキュリティ」ずいう翻蚳は、完党に反察の考えに぀ながりたす。

サりンド-このコンテキストではサりンドヌルの安党性は「信頌できる」ず解釈できたす。

翻蚳を改善するための提案がある堎合、たたぱラヌが芋぀かった堎合は、個人的なメッセヌゞを曞き蟌んでください。修正を詊みたす。
ダヌトチヌムにずっお重芁なステップが、ヌルセヌフティ開発の技術プレビュヌのプレれンテヌションで実珟したした。ヌルセヌフティは、怜出が困難なこずが倚いクラス党䜓のバグを回避し、ボヌナスずしお、パフォヌマンスを倧幅に向䞊させたす。珟時点では、予備的なテクニカルプレビュヌをリリヌスしおおり、フィヌドバックをお埅ちしおいたす。



この蚘事では、ヌルセヌフティを展開するDartチヌムの蚈画を明らかにし、サりンドヌルセヌフティずいう甚語の背埌にあるものず、このアプロヌチが他のプログラミング蚀語ずどのように異なるかを説明したす。

説明されおいるバヌゞョンは、2020幎6月10日に発衚されたした。

なぜ安党性がないのですか



Dartはタむプセヌフな蚀語です。これは、あるタむプの倉数を取埗するず、コンパむラヌがその倉数に属するこずを保蚌できるこずを意味したす。ただし、型の安党性だけでは、倉数がnullでないこずは保蚌されたせん。



ヌル゚ラヌは䞀般的です。GitHubで怜玢するず、Dartコヌドのnull倀によっお匕き起こされた䜕千ものレポヌト問題が芋぀かり、これらの問題を解決しようずするコミットがさらに増えたす。



次の䟋で、ヌルリンクの問題を芋぀けおください。



void printLengths(List<File> files) {
  for (var file in files) {
    print(file.lengthSync());
  }
}


この関数は、れロのパラメヌタヌで呌び出された堎合は確かに倱敗したすが、考慮すべき2番目のケヌスがありたす。



void main() {
  // Error case 1: passing a null to files.
  printLengths(null);
 
  // Error case 2: passing list of files, containing a null item.
  printLengths([File('filename1'), File('filename2'), null]);
}


ヌルセヌフティはこの問題を修正したす。



画像



ヌルセヌフティを䜿甚するず、より自信を持っおコヌドを信頌できたす。実行時に無効化された倉数にアクセスするずいう煩わしい゚ラヌはもうありたせん。コンパむル時の静的゚ラヌのみ。

完党に正盎に蚀うず、珟圚の実装では、実行時にnull゚ラヌをキャッチする機䌚がいく぀か残っおいたすが、それらに぀いおは埌で詳しく説明したす。

健党な信頌できるヌルの安党性



ダヌトのヌルセヌフティの実装は健党です。䞊蚘の䟋を䜿甚しお分析するず、Dartコンパむラは、ファむルの配列ずその䞭の芁玠がnullにならないこずを100確信しおいるこずを意味したす。 Dartコンパむラがコヌドを分析し、倉数がnullでないこずを確認するず、この倉数には垞に倀がありたす。デバッガで実行可胜なコヌドを確認するず、実行時にれロになる可胜性がたったくないこずがわかりたす。 「信頌性の高い」実装ではなく、実行時に倀の存圚をチェックする必芁がありたす。他の蚀語ずは異なり、Dartは実装の信頌性をSwiftず共有しおいたす。

, , , null safety . Swift, Kotlin Dart. .
Dartでのヌルセヌフティのこの堅牢な実装には、もう1぀の優れた結果がありたす。぀たり、プログラムをより小さく、より速くするこずができたす。Dartは、倉数が無効にならないようにするため、コンパむル結果を最適化できたす。たずえば、AOTコンパむラは、空の参照のチェックを远加する必芁がないため、より小さく高速なネむティブコヌドを生成できたす。



いく぀かの非垞に有望な予備的な結果を芋おきたした。たずえば、Flutterフレヌムワヌクの䞀般的なレンダリングパタヌンを゚ミュレヌトするマむクロベンチマヌクで19のパフォヌマンスの向䞊が芋られたした。



基本原則



ヌル安党性の詳现な蚭蚈に進む前に、ダヌトチヌムは3぀の基本原則を定矩したした



。デフォルトでは非 ヌル可胜性。/ **これは、ドキュメントではNNBDの省略圢ず芋なされるこずがよくありたす** /倉数を無効化できるこずをDartに明瀺的に指瀺しない堎合、無効化できないず芋なされたす。 APIでは、珟圚れロ以倖の倀が最も䞀般的であるこずがわかったため、これをデフォルトずしお遞択したした。/ **これはおそらく珟圚のFlutterAPIの䜜り盎しです** /。



段階的な適甚性..。ヌルセヌフティに段階的に移行する可胜性があるこずを理解しおいたす。実際、同じプロゞェクトにnull可胜およびnullの安党コヌドが必芁です。このために、コヌドの移行に圹立぀ツヌルを提䟛する予定です。



完党な信頌性音。䞊蚘のように、ダヌトのヌルセヌフティは安党です。プロゞェクト党䜓ず䟝存関係をnullセヌフティに倉換するず、信頌性のすべおのメリットが埗られたす。



安党性がない倉数の宣蚀



基本的な構文は十分に単玔です。以䞋は、さたざたな倉数を宣蚀する䟋です。null䞍可胜な倉数がデフォルトで䜿甚されるため、同じように芋えたすが、倀を無効にするこずはできたせん。



// In null-safe Dart, none of these can ever be null.
var i = 42;
final b = Foo();
String m = '';


Dartは、䞊蚘の倉数のいずれにもnullを割り圓おないようにしたす。1000行埌でもi = nullを実行しようずするず、静的分析゚ラヌず赀い波線が発生したす。プログラムはコンパむルを拒吊したす。



倉数をnull可胜にしたい堎合は、「」を䜿甚できたす。このような



// These are all nullable variables.
int? j = 1;  // Can be null later.
final Foo? c = getFoo();  // Maybe the function returns null.
String? n;  // Is null at first. Can be null at any later time, too


䞊蚘の倉数は、珟圚のバヌゞョンのDartのすべおの倉数ずたったく同じように動䜜したす。



'' 'は他の堎所でも䜿甚できたす



// In function parameters.
void boogie(int? count) {
  // It's possible that count is null.
}
// In function return values.
Foo? getFoo() {
  // Can return null instead of Foo.
}
// Also: generics, typedefs, type checks, etc.
// And any combination of the above.


しかし、繰り返しになりたすが、「」を䜿甚する必芁がほずんどないこずを願っおいたす。倉数の倧郚分はnull䞍可になりたす。



ヌルセヌフティを䜿いやすくする



Dartチヌムは、nullの安党性を可胜な限り䜿いやすくするために懞呜に取り組んでいたす。たずえば、nullをテストするためにifを䜿甚する次のコヌドを芋おください。



void honk(int? loudness) {
  if (loudness == null) {
    // No loudness specified, notify the developer
    // with maximum loudness.
    _playSound('error.wav', volume: 11);
    return;
  }
  // Loudness is non-null, let's just clamp it to acceptable levels.
  _playSound('honk.wav', volume: loudness.clamp(0, 11));
}


Dartは、ifステヌトメントを枡すたでにラりドネスをnullにするこずはできないこずを理解するのに十分賢いこずに泚意しおください。そのため、ダヌトを䜿甚するず、タンバリンで䞍必芁に螊るこずなく、clampメ゜ッドを呌び出すこずができたす。この䟿利さは、いわゆるフロヌ分析によっお提䟛されたす。Dartパヌサヌは、コヌドを実行しおいるかのようにコヌドを調べ、コヌドに関する詳现情報を自動的に把握したす。

Flow analysis, Dart, , , . null safety, :
foo(dynamic str) {
  if (str is String) {
    // dynamic   length,   
    //      String
    print(str.length);  
  }
}


, Dart , null, :
int sign(int x) {
  // The result is non-nullable.
  int result;
  if (x >= 0) {
    result = 1;
  } else {
    result = -1;
  }
  // By this point, Dart knows the result cannot be null.
  return result;
}


- (, result = -1;), Dart , result — , .
フロヌ分析は、関数内でのみ機胜したす。グロヌバル倉数たたはクラスフィヌルドがある堎合、Dartは倀がそれに割り圓おられるこずを保蚌できたせん。Dartは、アプリケヌション党䜓の実行フロヌをシミュレヌトするこずはできたせん。このため、倉数が最初にアクセスされたずきに初期化されるこずがわかっおいる堎合は、新しいlateキヌワヌドを䜿甚できたすが、宣蚀されたずきに初期化するこずはできたせん。



class Goo {
  late Viscosity v;
 
  Goo(Material m) {
    v = m.computeViscosity();
  }
}


最初は関係ありたせんが、vをれロにするこずはできないこずに泚意しおください。Dartは、れロ以倖の倀が割り圓おられ、コヌドが゚ラヌなしでコンパむルされるたで、vを読み取ろうずしないず考えおいたす。

— .



, . , . Dart , , , , , Kotlin .



— Swift- , , force unwrap Dart.

void main() {
  String? t;
  print(t!.length);
}


( late ‘!’) .



late , - Dart. ‘required’ . ‘@required’, .
class Temp {
  String str;
  Temp({required this.str});
  
  //   
  Temp.alt({strAtr}) : this.str = strAtr;
}




Dartチヌムは、技術的なプレビュヌにヌルの安党性をもたらすために1幎以䞊取り組んできたした。これは、2番目のバヌゞョンのリリヌス以来最倧の蚀語倉曎です。ただし、これは䞋䜍互換性を損なうこずのない倉曎です。既存のコヌドはnullの安党性でコヌドを呌び出すこずができ、その逆も可胜です。完党にリリヌスした埌でも、nullセヌフティは、準備ができたずきに䜿甚できる远加のオプションになりたす。既存のコヌドは倉曎されずに匕き続き機胜したす。



コアDartラむブラリは、nullセヌフティで最近曎新されたした。䞋䜍互換性の実䟋ずしお、既存のコアラむブラリの眮き換えは、テストが1回倱敗するこずなく、DartおよびFlutterテスト環境で実行されおいるテストアプリケヌションで゚ラヌが発生するこずもありたせんでした。 Googleの内郚クラむアントの倚くのコアラむブラリの曎新でさえ、問題なく実行されたした。リリヌス埌にnullセヌフティを䜿甚するように、すべおのパッケヌゞずアプリケヌションを再蚭蚈する予定です。同じようにしおください。しかし、あなたは自分のペヌスで、バッチごずに、アプリごずにそれを行うこずができたす。

これらの蚀葉は、Swift開発者、特に第3バヌゞョンには圓おはたりたす...

しかし、ここでもすべおがそれほどバラ色ではありたせんが、開発者自身は、1぀のプロゞェクトでnull安党コヌドず「叀い」コヌドを組み合わせるず健党性を保蚌できないず蚀いたすタむプシステム。

さらなる行動蚈画



ヌルセヌフティは、次の3぀のフェヌズで段階的に展開する予定です。



  1. テクニカルプレビュヌ。元の蚘事が公開されたずき2020幎6月10日にリリヌスされ、dev-branchで入手できたす。「今すぐ開始」のセクションに泚意する䟡倀がありたす。ただ非垞に䞍安定で、倉曎される可胜性があるため、補品コヌドでの䜿甚はただお勧めしたせん。しかし、私たちはあなたから話を聞いお、私たちにフィヌドバックを䞎えたいです
  2. ベヌタ版。ヌルセヌフティはダヌトベヌタブランチで利甚可胜になり、実隓フラグの埌ろに隠れるこずはなくなりたす。実装は、予想される最終バヌゞョンに近くなりたす。パッケヌゞずプラグむンのpub.devぞの移行を開始するこずは可胜ですが、この倉曎を安定したリリヌスずしお公開するこずはただお勧めしたせん。
  3. 安定版。ヌルセヌフティは誰でも利甚できたす。曎新されたパッケヌゞずプラグむンを安定版リリヌスずしお公開するように求められたす。この段階でアプリケヌションを移行するこずも䟡倀がありたす。


すべおが蚈画通りに進んだら、幎末たでに安党性がれロの安定版のダヌトをリリヌスする予定です。時折、ヌルセヌフティぞの移行に圹立぀ツヌルを远加したす。その䞭で



  • 既存のパッケヌゞずアプリケヌションを曎新する倚くのステップを自動化するのに圹立぀移行ツヌル。
  • pub.dev, null safety;
  • 'pub outdated' , null safety.




今日ヌルセヌフティを詊す最も速い方法は、nullsafety.dartpad.devを䜿甚するこずです。これはヌルセヌフティが有効になっおいるバヌゞョンのDartPadです。 Learn with Snippetsドロップダりンリストを開いお、新しい構文ずnullセヌフティの基本に関するチュヌトリアルシリヌズを芋぀けおください。



画像



小さなコン゜ヌルアプリケヌションでnullの安党性を詊すこずもできたすFlutterのような倧きなフレヌムワヌクはただ曎新されおいたせん。たず、devブランチからDart SDKをダりンロヌドする必芁がありたす。次に、このサンプルコン゜ヌルアプリケヌションをダりンロヌドできたす。 READMEファむルには、実隓的なnull安党機胜を有効にしおアプリケヌションを実行するための手順が含たれおいたす。䟋の他のファむルは、VSCodeおよびAndroidStudioでのデバッグを可胜にする実行構成を提䟛したす。



ドキュメントを読むこずもできたす今埌さらに衚瀺されたす。





UPDコメントで、私はこのリンクを提案したしたnullの安党性を理解する


Dartでヌルセヌフティを実装できるこずを非垞に嬉しく思いたす。空のリンクの信頌性ず安党性の高い凊理は、最も信頌性が高く生産性の高いコヌドを䜜成するのに圹立぀Dartの特城になりたす。ヌルセヌフティの珟圚のバヌゞョンを詊しお、バグトラッカヌにフィヌドバックを残しおください。玠敵なコヌドを

最埌たで読んでくれおありがずう。翻蚳は少し遅れたしたが、コメントが資料に圹立ち、1察1の翻蚳になっおいないこずを願っおいたす。この機胜は、Flutter゚コシステム党䜓にずっお非垞に䟿利な䞀歩であるず付け加えたいず思いたす。すでにラむブアプリで䜿甚できるのを楜しみにしおいたす。それたでの間、圌らが倖囜語で蚀うように、お楜しみに



All Articles