副作用とは?

巷で話題の 「ワクチンの副作用」 のことではないので、そっちじゃないんですか〜ってなった方は、ここでお戻りください🙇‍♀️

概要

  1. ある機能があるデータを変化させる
  2. 1で変化したデータを使用している処理の結果が変わる

参考:https://gimo.jp/glossary/details/side_effect.html

どういう時に起こるか?

値渡しと参照渡しを例にあげてみた(C言語)

参照渡しでは、関数呼び元のデータを変化させてしまっており、その後の処理の結果を変えてしまっている(副作用がある)

参考:https://chomado.com/programming/call-by-value-or-by-reference/

#include <stdio.h>

void function(int num)
{
    num += 100;
}

void function2(int *pNum)
{
    *pNum += 100;
}

int main()
{
    int number = 1;
    
    /* 値渡し */
    function(number);
    printf("値渡し後\n");
    printf("%d\n", number);
    
    /* 参照渡し */
    function2(&number);
    printf("参照渡し後\n");
    printf("%d\n", number);
}

===== 結果 =========
値渡し後
1
参照渡し後
101  <-  本来であればnumber = 1であるはず
  • この場合は、 function関数の呼び元で宣言されている number の値が、 function関数内で変化させられることはない
  • しかし参照渡しをしている function2 関数内では、呼び元の number が変えられてしまう事象が起きる

以下のサイトに上のコードをコピペして、実行すれば同じ結果が見れる

https://www.tutorialspoint.com/compile_c_online.php

副作用があることによるデメリットとは?

  1. バグが発生しやすい
  2. ソースコードの改修が困難になる
  3. ソースコードが読みづらくなる

副作用を起こさないために。

  • 変数のスコープを小さくする。
  • 外部の変数や状態に依存しない実装を心がける

今、自分が実装しているコードは、自分のコード以外で何か気にしなければいけないのだろうかと一瞬立ち止まって考えてみるのも良いかもですねぇ。

参考:https://boukenki.info/programming-hukusayou-imi/#i-3