forのネストを解消することは早すぎる抽象化
forのネストを解消することは早すぎる抽象化
本質的に二次元の探索が必要なケースでそうなるのはプログラミング対象の構造がコードに写し取られてるのだから適切
本質的に5次元の探索なら5重のネストになったとしてもそれが自然
code:python
for x in xs:
for y in ys:
for z in zs:
do_something(x, y, z)
code:js
for (const x of xs) {
for (const y of ys) {
for (const z of zs) {
doSomething(x, y, z);
}
}
}
なぜかそれを避けようとしてproductしたイテレータに対しての単一ループでやろうとする人もいる
これは単純なループであれば等価だから趣味嗜好の範囲
code:python
from itertools import product
for x, y, z in product(xs, ys, zs):
do_something(x, y, z)
code:js
for (const x, y, z of product(xs, ys, zs)) { doSomething(x, y, z);
}
function* product(a, b, c) {
for (const x of a) {
for (const y of b) {
for (const z of c) {
}
}
}
}
「単純なループだと時間が掛かりすぎるから枝刈りが必要だ」となった時にfor文で書いてる人がbreakやcontinueでサクッと済ませられる修正を、イテレータで書いてる人が🤯とかなることがある
これは「このプログラミング対象を1重ループで書いて良い」という判断が早すぎる抽象化だったということ
多重ループを解消したほうがサクッと済ませられる修正というのは存在しない?yosider.icon
本質的にn次元であるときは、各々の軸が同じ単位であったりすることがある気がするmiyamonz.icon
x,y,zが同じ概念、単位を持ってる
異なる概念の二重ループだと、一つのループや、その内側などを関数として切り出すと読みやすくなる傾向にある、と思うmiyamonz.icon
usersがいて、各々がpostsを持ってるみたいな
それは「異なる概念だから」切り出せるのではなく「ユーザによってポストに対して行う処理に差はない」という処理の独立性があるから切り出せるnishio.icon
xyzの時に「枝刈りしようとすると…」と書いたが、それはつまり「変数間に独立性がなくなったら」と言うことでもある
多重ループを解消することは抽象化なのだろうか?yosider.icon