オブジェクト指向だと関数を受け渡しすべきではない?
◆ 関数を受け渡ししてると想定したものと違った時にわかりやすいエラー出せない
◆ 型チェックしようにも関数だと難しい
◆ 関数をそのまま渡せないようなオブジェクト指向言語だとどうなるんだろう
◆ → インスタンス渡してそのメソッドの実行で良さそう
◆ 型チェックしようにも関数だと難しい
◆ 関数をそのまま渡せないようなオブジェクト指向言語だとどうなるんだろう
◆ → インスタンス渡してそのメソッドの実行で良さそう
「instanceof で型チェックして期待したものなら」 とやろうとしていました
そこで思ったのが 「関数だとわからなくない?」 というものです
例えばこういうのです
関数を返す関数を作って その返り値を別の関数に渡したり そんなことは JavaScript ではよくあるものです
でもその関数が期待したものかを事前チェックって難しいです
引数の数くらいならわかりますが デフォルト引数や可変引数で受け取るようになってたら数えられませんし
一応名前という手もあります
しかしアロー関数には名前は付けられません
と一時的に変数に入れるとその名前が使われますが わかりづらいですしつい直接 return に直したくなってしまうものです
型で見分けるを重視するならこんなこともできなくはありません
ですが これだと文字列から関数を作るというあまり気が進まないコードになります
型を重視してるといえばオブジェクト指向ですが その界隈だとどうしてるのでしょうか
C# だと関数型要素も含まれているので 関数を受け渡しできて 引数と返り値の数と型が合えば使えます
関数を受け渡しできないような関数型成分が全然ない言語だとどうなるのか なかった頃ってどうしてたのか考えてみると
単純にインスタンスを返せば問題なさそうです
関数を受け取り実行したいなら その関数 (メソッド) を持つインスタンスを受け取ってそれを実行します
直接実行できずインスタンスを挟む手間はありますが インスタンスの型で判断できる分おかしな関数が来ることは減らせます
思ったほど大変でもないですし 関数を受け取るのが多すぎて何するのを渡せばいいのか分かりづらくて チェックもし辛いことがあるのでそういう方法もありかなと思いました
そこで思ったのが 「関数だとわからなくない?」 というものです
例えばこういうのです
function a(x){
const a = 1 + x
return function(){
return a
}
}
function b(x){
const b = 10 + x
return function(){
return b
}
}
function c(fn){
// 受け取った fn は b 関数の返り値を想定してる
}
c(a())
関数を返す関数を作って その返り値を別の関数に渡したり そんなことは JavaScript ではよくあるものです
でもその関数が期待したものかを事前チェックって難しいです
引数の数くらいならわかりますが デフォルト引数や可変引数で受け取るようになってたら数えられませんし
一応名前という手もあります
しかしアロー関数には名前は付けられません
function f(){
const b = () => 1
return b
}
f().name
// b
と一時的に変数に入れるとその名前が使われますが わかりづらいですしつい直接 return に直したくなってしまうものです
型で見分けるを重視するならこんなこともできなくはありません
class Fn extends Function {}
const f = new Fn("a", "b", "return a + b")
f(1, 2)
// 3
f instanceof Fn
// true
ですが これだと文字列から関数を作るというあまり気が進まないコードになります
型を重視してるといえばオブジェクト指向ですが その界隈だとどうしてるのでしょうか
C# だと関数型要素も含まれているので 関数を受け渡しできて 引数と返り値の数と型が合えば使えます
関数を受け渡しできないような関数型成分が全然ない言語だとどうなるのか なかった頃ってどうしてたのか考えてみると
単純にインスタンスを返せば問題なさそうです
関数を受け取り実行したいなら その関数 (メソッド) を持つインスタンスを受け取ってそれを実行します
直接実行できずインスタンスを挟む手間はありますが インスタンスの型で判断できる分おかしな関数が来ることは減らせます
思ったほど大変でもないですし 関数を受け取るのが多すぎて何するのを渡せばいいのか分かりづらくて チェックもし辛いことがあるのでそういう方法もありかなと思いました