プログラミングマガジン

プログラミングを中心にIT技術をできるだけわかりやすくまとめます。

  • ホーム
  • プログラミング全般
  • 【プログラミング】「副作用」、フロントエンド開発でイミュータブルが要求される背景など
 
 
     
  • サーバー言語  
    • Python
    • Ruby
    • PHP
    • SQL
  •  
  • インフラ  
       
    • AWS
    •  
    • 基本
    • Git
  • Web
       
    • Web開発
    • JavaScript
    • Vue.js
    • React
  •  
  • 設計  
       
    • 実装設計
    • DB設計
  • 問い合わせ
  

【プログラミング】「副作用」、フロントエンド開発でイミュータブルが要求される背景など

08.29

  • miyabisan2
  • コメントを書く

この記事は2分で読めます

副作用の例

実行するタイミングによって何の値が返ってくるかわからない処理が記述してある。

  • 時刻を取得する処理
  • ファイル読み込み
  • DB読み込み
  • 環境変数の参照
  • グローバル変数参照
  • 乱数生成
  • JavaScriptのconsole.log(なぜ副作用があるかはよくわからない。)

classであれば保持しているデータを外部からいつでも変更できる。(セッターメソッドなど)

副作用は全て排除すれば良いのか?

では、画面入力やファイル入力などプログラミングには状態を持たせることが不可欠なので、以下の思想が重要になる。

「副作用を持たない部分」(純粋関数)と「副作用を持つ部分」を分離することが重要。

副作用を持つ関数から副作用を持たない関数を呼び出して良いが、逆に副作用を持たない関数から副作用を持つ関数を呼び出してはいけない。

副作用を持たない関数

引数に日付を受け取って処理する関数

副作用を持つ関数

関数の内部で日付を生成して処理する関数

副作用の対策

実行するタイミングによって何の結果が返ってくるかわからない。

外部から値をもらうように記述する。

副作用があるソースのデメリット

テストコードを書きづらくなる。

実行するたびに結果が変わるのでテストコードは書けないです。

フロントエンドはなぜイミュータブルが良いのか?

そもそもイミュータブルとは?

オブジェクトや配列の状態が変わらないことです。

なぜ、昨今のフロント開発ではイミュータブルなことが推奨されているか

動的に画面を再描画させるため

昨今のWeb開発では、時間経過やユーザーのインタラクションによって状態を変化させることでシームレス(途切れなく)に描画を変化させる必要がある。

JavaScriptは配列やオブジェクト、クラスインスタンスの値を変更した場合は、その変更は変更元の変数を破壊的な影響を及ぼしてしまいます。

フロントエンドでは動的に画面を描画するには、動的に画面を描画するには状態を変更する必要があるので、副作用の影響が及びやすいです。

例えば、ReactやReduxのstateはオブジェクトの差分でチェックしており、ミュータブルに値を更新してしまうと変更前の値も書き変わってしまい同一とみなされて再描画されないためです。(shallow equality checking(参照元のメモリの番地が変わっているかを見ている。中身が変わっても参照元が同じだと変化がないとみなされる。)という仕組みを採用しています。)

予測できないstateの更新を妨げられる。

いつでも誰でもstateを更新できてしまうと現在の状態が分からなくなってしまう。しかも、バグではないからエラーも出ないので誰が更新したかを追うことも難しいです。

フロントはデータ数が少ないので、複製コストが低い

フロントは描画コストの都合上データ数が少なくなっています。なので、仮にイミュータブルを保つために複製したとしても大したコストにはなりません。

対策

スプレット構文を使って値をイミュータブルにすることです。新しいオブジェクトを生成します。

1
2
3
4
const objA = {a: 10 };
let objB = { ...objA, b: 20 };
console.log(objA); // -> { a: 10 }
console.log(objB); // -> { a:10,b: 20 }

ただし、イミュータブルにしすぎるとソースが冗長になる。

ただ、イミュータブルであることを守りすぎると「...」が増えすぎてソースが読みづらくなります。

Immerを使う。

Immerというライブラリを使うのが良いです。概要だけ説明すると、破壊的に思いっきり書いたとしてもこのライブラリが普通にイミュータブルなコードに勝手に変換してくれます。うしたスプレット構文を排除してスッキリ書こうというのを目指したのが、immerというライブラリです。

スポンサーリンク
  • 2021 08.29
  • miyabisan2
  • コメントを書く
  • プログラミング全般
  • Tweets Twitter
  • このエントリーをはてなブックマークに追加
  • LINEで送る

関連記事

  1. 2018 03.25

    【プログラミング】バージョンの付け方

  2. 2021 12.08

    【プログラミング全般】「ランタイムライブラリ」と「スタティックライブラリ」の違い、ライブラリの時代変革など

  3. 2021 12.12

    【プログラミング全般】プログラミングの歴史

  4. 2021 12.11

    【プログラミング全般】「ステートレス」と「ステートフル」の違い

  5. 2018 07.23

    【プログラミング全般】「ローカライズ」、「ローカライゼーション」(L10n)、「i18n(アイエイティーンエヌ)」とは?

  6. 2023 10.06

    【VSCode】devContainer

  • コメント ( 0 )
  • トラックバック ( 0 )
  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

返信をキャンセルする。

【デザインパターン】「Observer」パターン、実装…

【関数型言語】「計算モデル」の種類、カリー化

RETURN TOP

著者プロフィール

エンジニア歴10年で過去に業務系、Webデザイン、インフラ系なども経験あります。現在はWeb系でフロントエンド開発中心です。

詳細なプロフィールはこちら

スポンサーリンク

カテゴリー

  • Android
  • AngularJS
  • API
  • AWS
  • C++
  • CSS
  • cursor
  • C言語
  • DDD
  • DevOps
  • Django
  • Docker
  • Figma
  • Git
  • GitLab
  • GraphQL
  • gRPC
  • Hasura
  • Java
  • JavaScript
  • Kubernetes
  • Laravel
  • linux
  • MySQL
  • Next.js
  • nginx
  • Node.js
  • NoSQL
  • Nuxt.js
  • Oracle
  • PHP
  • Python
  • React
  • Redux
  • Rspec
  • Ruby
  • Ruby on Rails
  • Sass
  • Spring Framework
  • SQL
  • TypeScript
  • Unity
  • Vue.js
  • Webサービス開発
  • Webデザイン
  • Web技術
  • インフラ
  • オブジェクト指向
  • システム開発
  • セキュリティ
  • その他
  • データベース
  • デザインパターン
  • テスト
  • ネットワーク
  • プログラミング全般
  • マイクロサービス
  • マイクロソフト系技術
  • マルチメディア
  • リファクタリング
  • 副業
  • 未分類
  • 業務知識
  • 生成AI
  • 設計
  • 関数型言語
RETURN TOP

Copyright ©  プログラミングマガジン | プライバシーポリシー