質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

3回答

824閲覧

関数は機能ごとに分けるべきか?機能を引数に渡して関数はまとめるべきか?

nikuatsu

総合スコア177

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2022/05/24 04:15

編集2022/05/24 04:26

ご質問

関数を作るとき、機能ごとに関数を分けますか?機能を引数で渡して分岐し関数はまとめますか?

次のような例でふと思いました。

【例1】
INSERT、DELETE、UPDATE の場合

php

1<?php 2// A:機能ごとに関数を分ける 3function insert_row( $args ){} 4function delete_row( $args ){} 5function update_row( $args ){} 6 7// B:機能を引数で渡して分岐し関数はまとめる 8function apply_row( $type, $args ){ 9 if( $type === 'insert' ){} 10 else if( $type === 'delete' ){} 11 else if( $type === 'update' ){} 12} 13?>

【例2】
ローカルストレージの値を取得する場合

JavaScript

1// A:機能ごとに関数を分ける 2function getFontFamily(){ 3 return localStorage.getItem('font-family') || 'serif'; 4} 5function getMode(){ 6 return localStorage.getItem('mode') || 'normal'; 7} 8 9// B:機能を引数で渡して分岐し関数はまとめる 10function getStorage( type ){ 11 if( type === 'font-family' ){ 12 return localStorage.getItem('font-family') || 'serif'; 13 }else if( type === 'mode' ){ 14 return localStorage.getItem('mode') || 'normal'; 15 } 16}

いかがでしょうか。

「どういうときにAのように分けて、どういうときにBのようにまとめる」など、みなさんがユルめに従いがちな、慣習的なものがあれば知りたいです。

私の場合

私は独学で素人で(なのでここでやり方を述べるのは恐縮ですが)、これまで「基本はBでまとめるけど、関数が長くなりすぎたらAで分ける」というなんとなくな方法でした。

または次のような感じで、Aのように分けると、引数のキーが$args = ['id'=>1',name'=>'a','age'=>20,,,,] などと多いときに同じ展開処理が複数の関数で重複するため、これを嫌ってBでまとめること多いです。(PHPならextractがありますが、どの変数がextractで展開されたものなのかわかりにくいので使いたくない派です。)

php

1// A:機能ごとに関数を分ける 2function insert_row( $args ){ 3 // ここでも展開 4 $id = $args['id']; 5 $name = $args['name']; 6 $age = $args['age']; 7} 8function delete_row( $args ){ 9 // ここでも展開 10 $id = $args['id']; 11 $name = $args['name']; 12 $age = $args['age']; 13} 14function update_row( $args ){ 15 // ここでも展開 16 $id = $args['id']; 17 $name = $args['name']; 18 $age = $args['age']; 19} 20 21// B:機能を引数で渡して分岐し関数はまとめる 22function apply_row( $type, $args ){ 23 // 展開がこの1回で済む 24 $id = $args['id']; 25 $name = $args['name']; 26 $age = $args['age']; 27 28 if( $type === 'insert' ){} 29 else if( $type === 'delete' ){} 30 else if( $type === 'update' ){} 31}

AとBの使い分けについて、統一的なルールや一般的な慣習や個人的なご意見など、幅広くお聞かせいただければ幸いです。よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

PHPよくわからないので例2について(JavaScriptもすごくわかっているわけではないですが)。

個人的には、これはAかと思います。
Bはそれぞれがローカルストレージに保存しているという仕様に依存しているので、低レベルな関数名になっており機能がわかりにくく、変更に弱そうで好みではないです。

どうしても記述が面倒ということであれば、高レベルな関数から低レベルな関数を呼び出すような形で、こうするような気がします。

js

1function getFontFamily(){ 2 return getStorage('font-family'); 3} 4function getMode(){ 5 return getStorage('mode'); 6} 7 8function getStorage( type ){ 9 if( type === 'font-family' ){ 10 return localStorage.getItem('font-family') || 'serif'; 11 }else if( type === 'mode' ){ 12 return localStorage.getItem('mode') || 'normal'; 13 } 14}

これであれば、font-family だけローカルストレージを参照しないという変更があっても、getFontFamily 関数を変更すればよいと思います。

投稿2022/05/25 01:47

Lhankor_Mhy

総合スコア36115

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nikuatsu

2022/05/29 09:45

ありがとうございます。まとめるよりも変更への柔軟性を重視するという発想になるわけですね。わかってきました。ありがとうございます。
nikuatsu

2022/05/29 09:54

ちなみにこれはクラスを使うような機能ではないでしょうか? クラス入門者でいまいち理解が及んでいませんが、クラスにするならこう↓だとして、こうせず関数にすべき機能でしょうか? class localStoage{ constructor(font, mode) { this.font = font this.mode = mode } calc( type ) { return getStorage( type ); } } const localStoage = new localStoage(); localStoage.calc = 'sans';
Lhankor_Mhy

2022/05/30 00:49

クラスにするかどうかは全体の構成によると思いますが、当方の回答は高レベルなものと低レベルなものを区別した方がいいという、言ってみればレイヤーの話です。抽象度の低い関数は、一見して何をしてるのかわからないので可読性が下がったりプログラマの負担が増えたりする、という話でもあります。 例示のコードでも(何をしているコードなのかわかりませんが)別に構わないと思いますが、結局のところ抽象度が低くなっているので抽象度の高い関数でラップしたくなるなあ、というのが個人的な感想です。
nikuatsu

2022/05/30 09:31

抽象度の高いものでどんどんラップしていく感じですか。ありがとうございます。練習していきます。
Lhankor_Mhy

2022/05/30 10:22

いえ、クラスを作るにしても抽象度の高いクラスにしては? ということです。
kokemaru3

2022/05/31 06:08

参考になりました。
guest

0

機能を引数に渡して関数はまとめる

と、忘れてしまって、同じ機能の関数を作る羽目になります

投稿2022/05/24 05:03

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2022/05/24 05:11

普通に考えて忘れるわけないと思いますが、それでも忘れる人はどうやったって忘れます。
nikuatsu

2022/05/24 05:53

ありがとうございます。たくさん書くと忘れることもあるかもしれませんね。気を付けたいと思います。
guest

0

命題のようにまとめるならクラスでメソッドを使うのが現実的だと思います

投稿2022/05/24 04:45

yambejp

総合スコア114839

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nikuatsu

2022/05/24 06:02 編集

ありがとうございます。恐れ入りますが、本例でのクラスを少しご回答頂けませんでしょうか。クラス未経験で本例での応用のイメージが掴めません… AやBがクラスでどう便利になるのかというところがよく理解できていないのです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問