Skip to content

Commit

Permalink
refactor(textlint): textlint-rule-ja-no-redundant-expressionの検知を元に修正
Browse files Browse the repository at this point in the history
  • Loading branch information
azu committed Jan 4, 2019
1 parent 56daefe commit 0742571
Show file tree
Hide file tree
Showing 19 changed files with 59 additions and 51 deletions.
4 changes: 2 additions & 2 deletions source/basic/array/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -786,7 +786,7 @@ myFunc("a", "b", "c");
## メソッドチェーンと高階関数 {#method-chain-and-high-order-function}

配列で頻出するパターンとしてメソッドチェーンがあります。
メソッドチェーンとは名前のとおり、メソッドの呼び出しを行いその結果の値に対してさらにメソッドを呼び出すパターンのことを言います
メソッドチェーンとは名前のとおり、メソッドを呼び出した返り値に対してメソッド呼び出しをするパターンのことを言います

次のコードでは、`Array#concat`メソッドの返り値、つまり配列に対してさらに`concat`メソッドを呼び出すというメソッドチェーンが行われています。

Expand Down Expand Up @@ -844,4 +844,4 @@ console.log(versionNames); // => ["ECMAScript 1", "ECMAScript 2", "ECMAScript 3"
[ループと反復処理]: ../loop/README.md
[immutable-array-prototype]: https://github.com/azu/immutable-array-prototype "azu/immutable-array-prototype: A collection of Immutable Array prototype methods(Per method packages)."
[Lodash]: https://lodash.com/ "Lodash"
[Immutable.js]: https://facebook.github.io/immutable-js/ "Immutable.js"
[Immutable.js]: https://facebook.github.io/immutable-js/ "Immutable.js"
22 changes: 13 additions & 9 deletions source/basic/async/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ author: azu
同期処理では実行している処理はひとつだけとなるため、とても直感的な動作となります。

一方、同期的にブロックする処理が行われていた場合には問題があります。
同期処理ではひとつの処理が終わるまで次の処理を行うことができないためです
同期処理ではひとつの処理が終わるまで、次の処理へ進むことができないためです

次のコードの`blockTime`関数は指定した`timeout`ミリ秒だけ無限ループを行い同期的にブロックする処理です。
この`blockTime`関数を呼び出すと、指定時間経過するまで次の処理(次の行)が呼ばれません。
Expand All @@ -47,7 +47,7 @@ console.log("この行が呼ばれるまで処理が1秒間ブロックされる

このような同期的にブロックするのは、ブラウザでは大きな問題となります。
なぜなら、JavaScriptは基本的にブラウザのメインスレッド(UIスレッドとも呼ばれる)で実行されるためです。
そのため、JavaScriptで同期的にブロックする処理を行うと他の処理ができなくなるため、画面がフリーズしたような体感を与えてしまいます。
そのため、JavaScriptで同期的にブロックする処理すると他の処理ができなくなるため、画面がフリーズしたような体感を与えてしまいます。

さきほどの例では1秒間も処理をブロックしているため、1秒間スクロールやクリックなどの他の操作が効かないといった悪影響がでます。

Expand All @@ -59,7 +59,7 @@ console.log("この行が呼ばれるまで処理が1秒間ブロックされる
また非同期処理はコードを順番に処理していきますが、ひとつの非同期処理が終わるのを待たずに次の処理を評価します。
つまり、非同期処理では同時に実行している処理は複数あります。

JavaScriptにおいて代表的な非同期処理を行う関数として`setTimeout`関数があります。
JavaScriptにおいて非同期処理をする代表的な関数として`setTimeout`関数があります。
`setTimeout`関数は`delay`ミリ秒後に、`コールバック関数`を呼び出すようにタイマーへ登録する非同期処理です。

<!-- doctest:disable -->
Expand Down Expand Up @@ -97,11 +97,15 @@ console.log("2. 同期的な処理を実行します");

このコードを実行した結果のコンソールログは次のようになります。

<!-- textlint-disable preset-ja-technical-writing/ja-no-redundant-expression -->

1. setTimeoutのコールバック関数を10ミリ秒後に実行します
2. 同期的な処理を実行します
3. ブロックする処理を開始します
4. ブロックする処理が完了しました

<!-- textlint-enable preset-ja-technical-writing/ja-no-redundant-expression -->

このように、非同期処理(`setTimeout`のコールバック関数)は、コードの見た目上の並びとは異なる順番で実行されることがわかります。

## 非同期処理はメインスレッドで実行される {#async-and-main-thread}
Expand Down Expand Up @@ -240,7 +244,7 @@ ES2015より前までは、**エラーファーストコールバック**とい

つまり、ひとつのコールバック関数で失敗した場合と成功した場合の両方を扱うルールとなります。

たとえば、Node.jsでは`fs.readFile`関数というファイルシステムからファイルをロードする非同期処理を行う関数があります
たとえば、Node.jsでは`fs.readFile`関数というファイルシステムからファイルをロードする非同期処理する関数があります
指定したパスのデータを読むため、ファイルが存在しない場合やアクセス権限の問題から読み取りに失敗することがあります。
そのため、`fs.readFile`関数の第2引数にわたすコールバック関数にはエラーファーストコールバックスタイルの関数を渡します。

Expand All @@ -258,12 +262,12 @@ fs.readFile("./example.txt", (error, data) => {
});
```

このエラーファーストコールバックはNode.jsでは広く使われ、Node.jsの標準APIにおいても非同期処理を行う関数では利用されています
このエラーファーストコールバックはNode.jsでは広く使われ、Node.jsの標準APIにおいても非同期処理する関数では利用されています
詳しい扱い方については[ユースケース: Node.jsでCLIアプリケーション][]にて紹介します。

実際にエラーファーストコールバックで非同期な例外処理を扱うコードを書いてみましょう。

次のコードの`dummyFetch`関数は、擬似的なリソースの取得を行う非同期な処理です
次のコードの`dummyFetch`関数は、擬似的なリソースの取得する非同期な処理です
第1引数に任意のパスを受け取り、第2引数にエラーファーストコールバックスタイルの関数を受けとります。

この`dummyFetch`関数は、任意のパスにマッチするリソースがある場合には、第2引数のコールバック関数に`null`とレスポンスオブジェクトを渡して呼び出します。
Expand Down Expand Up @@ -1213,7 +1217,7 @@ Promise.race([
このようにPromiseを使うことで非同期処理のさまざまなパターンが形成できます。
より詳しいPromiseの使い方については[JavaScript Promiseの本][]というオンラインで公開されている文書にまとめられています。

一方でPromiseはただのビルトインオブジェクトであるため、非同期処理間の連携を行うにはPromiseチェーンのように少し特殊な書き方や見た目になります
一方でPromiseはただのビルトインオブジェクトであるため、非同期処理間の連携するにはPromiseチェーンのように少し特殊な書き方や見た目になります
また、エラーハンドリングについても`Promise#catch`メソッドや`Promise#finally`メソッドなど`try...catch`構文とよく似た名前を使います。
しかし、Promiseは構文ではなくただのオブジェクトであるため、それらをメソッドチェーンとして実現しないといけないといった制限があります。

Expand Down Expand Up @@ -1354,7 +1358,7 @@ async function asyncMain() {
}
```

普通の処理の流れでは非同期処理を実行した場合にその非同期処理の完了を待つことなく、次の行(次の文)を実行します。
普通の処理の流れでは、非同期処理を実行した場合にその非同期処理の完了を待つことなく、次の行(次の文)を実行します。
しかし`await`式では非同期処理を実行し完了するまで、次の行(次の文)を実行しません。
そのため`await`式を使うことで非同期処理が同期処理のように上から下へと順番に実行するような処理順で書けます。

Expand Down Expand Up @@ -1601,7 +1605,7 @@ fetchResources().then((results) => {
});
```

Promiseチェーンで`fetchResources`関数書いた場合はコールバックの中で処理を行うためややこしい見た目になりがちです
Promiseチェーンで`fetchResources`関数書いた場合は、コールバックの中で処理するためややこしい見た目になりがちです
一方、Async Functionと`await`式で書いた場合は、取得と追加を順番に行うだけとなりネストがなく見た目はシンプルです。

このようにAsync Functionと`await`式でも非同期処理を同期処理のような見た目で書けます。
Expand Down
8 changes: 4 additions & 4 deletions source/basic/class/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,7 @@ class Point {
この`Point`クラスのインスタンスを作成するには`new`演算子を使います。
`new`演算子には関数呼び出しと同じように引数を渡すことができます。
`new`演算子の引数はクラスの`constructor`メソッド(コンストラクタ関数)の仮引数に渡されます。
そして、コンストラクタのなかではインスタンスオブジェクト(`this`の初期化処理を行います
そして、コンストラクタのなかではインスタンスオブジェクト(`this`の初期化処理します

{{book.console}}
```js
Expand Down Expand Up @@ -939,10 +939,10 @@ const child = new Child("引数1", "引数2");
// "Childコンストラクタの処理", "引数1", "引数2"
```

`class`構文でのクラス定義では、`constructor`メソッド(コンストラクタ)で何も処理を行わない場合は省略できることを紹介しました
`class`構文でのクラス定義では、`constructor`メソッド(コンストラクタ)で何も処理しない場合は省略できることを紹介しました
これは、継承した子クラスでも同じです。

次のコードでは、`Child`クラスのコンストラクタでは何も処理を行っていません
次のコードの`Child`クラスのコンストラクタでは、何も処理していません
そのため、`Child`クラスの`constructor`メソッドの定義を省略できます。

{{book.console}}
Expand All @@ -967,7 +967,7 @@ class Child extends Parent {

コンストラクタの処理順は親クラスから子クラスへと順番が決まっています。

`class`構文ではかならず親クラスのコンストラクタ処理(`super()`を呼び)を先に行い、その次に子クラスのコンストラクタ処理を行います
`class`構文ではかならず親クラスのコンストラクタ処理(`super()`を呼び)を先に行い、その次に子クラスのコンストラクタ処理へ進みます
子クラスのコンストラクタでは、`this`を触る前に`super()`で親クラスのコンストラクタ処理を呼び出さないと`SyntaxError`となるためです。

次のコードでは、`Parent``Child`でそれぞれインスタンス(`this`)の`name`プロパティに値を書き込んでいます。
Expand Down
4 changes: 2 additions & 2 deletions source/basic/condition/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ if (x > 10) {
```

if文の`条件式`には`true`または`false`といった真偽値以外の値も指定できます。
真偽値以外の値の場合、その値を暗黙的に真偽値へ変換した評価結果を使い、if文の判定を行います
真偽値以外の値の場合、その値を暗黙的に真偽値へ変換してから、条件式として判定をします

真偽値へ変換した結果が`true`となる値の種類は多いため、逆に変換した結果が`false`となる値を覚えるのが簡単です。JavaScriptでは次の値は`false`に変換され、これらの値は**falsy** と呼ばれます。(「[暗黙的な型変換][]の章」を参照)

Expand Down Expand Up @@ -253,4 +253,4 @@ switch文のcase節では基本的に`break;`を使いswitch文を抜けるよ
- [制御フローとエラー処理 - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Control_flow_and_error_handling)


[暗黙的な型変換]: ../implicit-coercion/README.md
[暗黙的な型変換]: ../implicit-coercion/README.md
2 changes: 1 addition & 1 deletion source/basic/ecmascript/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ author: azu
ここまでJavaScriptの基本文法について見ていきましたが、その文法を定めるECMAScriptという仕様自体がどのように変化していくのかを見ていきましょう。

ECMAScriptは[Ecma International][]という団体によって標準化されている仕様です。
Ecma InternationalはECMAScript以外にもC#やDartなどの標準化作業を行っています
Ecma InternationalはECMAScript以外にもC#やDartなどの標準化作業をしています
Ecma International中のTechnical Committee 39(TC39)という技術委員会が中心となって、ECMAScript仕様についてを議論しています。
この技術委員会はMicrosoft、Mozilla、Google、AppleといったブラウザベンダーやECMAScriptに関心のある企業などによって構成されます。

Expand Down
2 changes: 1 addition & 1 deletion source/basic/function-declaration/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ description: 関数の宣言方法とメソッドについて
関数とは、ある一連の手続き(文の集まり)を1つの処理としてまとめる機能です。
関数を利用することで、同じ処理を毎回書くのではなく、一度定義した関数を呼び出すことで同じ処理を実行できます。

これまで利用してきたコンソール表示を行うConsole APIも関数です。
これまで利用してきたコンソール表示するConsole APIも関数です。
`console.log`は「受け取った値をコンソールへ出力する」という処理をまとめた関数です。

この章では、関数の定義方法や呼び出し方について見ていきます。
Expand Down
8 changes: 4 additions & 4 deletions source/basic/implicit-coercion/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ author: azu
[演算子][]の章にて、等価演算子において**暗黙的な型変換**による意図しない挙動について紹介しました。

> 等価演算子(`==`)はオペランド同士が異なる型の値であった場合に、
> 同じ型となるように**暗黙的な型変換**してから比較を行います
> 同じ型となるように**暗黙的な型変換**してから比較します
暗黙的な型変換の例として、数値と真偽値の加算を見てみましょう。
多くの言語では、数値と真偽値の加算は型エラーとなり、コンパイルエラーまたは実行時エラーとなります。
Expand Down Expand Up @@ -353,7 +353,7 @@ isNaN([]); // => false
isNaN(NaN); // => true
```

同様の処理を行う方法として`Number.isNaN(x)`メソッドがあります。
同様の処理する方法として`Number.isNaN(x)`メソッドがあります。
実際に値が`NaN`かを判定する際には、`Number.isNaN(x)`メソッドを利用するとよいでしょう。

{{book.console}}
Expand Down Expand Up @@ -454,7 +454,7 @@ sum(x, y, z); // => Error
エラーとなった時に呼ばれる側と呼び出し側でどちらに問題があるのかが明確になります。
この場合は、`sum`関数へ`undefined`な値を渡している呼び出し側に問題があります。

JavaScriptは、型エラーに対して暗黙的な型変換を行うなど驚くほど許容しています
JavaScriptは、型エラーに対して暗黙的な型変換してしまうなど驚くほど許容しています
そのため、大きなJavaScriptアプリケーションを書く場合は、このような検出しにくいバグを見つけられるように書くことは重要です。

## 明示的な変換でも解決しないこと {#unsolved-problem}
Expand All @@ -472,7 +472,7 @@ JavaScriptの型変換は基本的に情報が減る方向へしか変換でき
`""`(空文字)はfalsyな値であるため、明示的に`Boolean`コンストラクタ関数で真偽値へ変換できます。
しかし、falsyな値は空文字以外にもあるため、明示的に変換したからといって空文字だけを判定できるわけではありません。

次のコードでは、明示的な型変換を行っていますが`0`**空文字**となってしまい意図しない挙動になっています。
次のコードでは、明示的な型変換をしていますが`0`**空文字**となってしまい意図しない挙動になっています。

{{book.console}}
```js
Expand Down
6 changes: 5 additions & 1 deletion source/basic/loop/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,14 @@ while (条件式)
while文の実行フローは次のようになります。
最初から`条件式``false`である場合は、何も実行せずwhile文は終了します。

<!-- textlint-disable preset-ja-technical-writing/ja-no-redundant-expression -->

1. `条件式` の評価結果が`true`なら処理を続け、`false`なら終了
2. `実行する文`を実行
3. ステップ1へ戻る

<!-- textlint-enable preset-ja-technical-writing/ja-no-redundant-expression -->

次のコードでは`x`の値が10未満であるなら、コンソールへ繰り返しログが出力されます。
また、`実行する文`にて、`x`の値を増やし`条件式``false`となるようにしています。

Expand Down Expand Up @@ -172,7 +176,7 @@ switch文で出てきたものと同様で、処理中のループ文を終了
1つでも偶数があるかが分かればいいため、配列内から最初の偶数を見つけたらfor文での反復処理を終了します。
このような処理はベタ書きせずに、関数として実装するのが一般的です。

同様の処理を行う `isEvenIncluded` 関数を実装してみます。
同様の処理をする `isEvenIncluded` 関数を実装してみます。
次のコードでは、break文が実行され、ループを抜けた後にreturn文で結果を返しています。

{{book.console}}
Expand Down
4 changes: 2 additions & 2 deletions source/basic/object/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -222,7 +222,7 @@ console.log(object.key); // => "value"
```

このように、プロパティを初期化時以外に追加してしまうと、そのオブジェクトがどのようなプロパティを持っているかがわかりにくくなります。
そのため、できる限り作成後に新しいプロパティの追加を行わないほうがよいでしょう
そのため、できる限り作成後に新しいプロパティの追加しないほうがよいでしょう
つまり、オブジェクトの作成時のオブジェクトリテラルの中でプロパティを定義することを推奨します。

### [コラム] constで定義したオブジェクトは変更可能 {#const-and-object}
Expand Down Expand Up @@ -611,4 +611,4 @@ console.log(cloneObject.nest === object.nest); // => false
[ループと反復処理]: ../loop/README.md "ループと反復処理"
[変数と宣言]: ../variables/README.md "変数と宣言"
[クラス]: ../class/README.md "クラス"
[変数と宣言のconstについて]: ../variables/README.md#const
[変数と宣言のconstについて]: ../variables/README.md#const
Loading

0 comments on commit 0742571

Please sign in to comment.