論理的凝集
論理的に似ている複数の処理が関数にまとまっている
意味がわからんmrsekut.icon
「論理的」とフラグにどういう関係があるんだ
「論理的に似ている」と「機能的」がなんで別物なんだ?
そしてなぜ後者の方が優れているのか
名前か説明かあるいはその両方がおかしい
論理的結合は、モジュールの要素間に何らかの論理的関係を示唆します。例としては、プログラムのためのすべての入出力操作を実行するモジュールや、すべてのデータを編集するモジュールがあります。論理的に結合された「すべてのデータを編集する」モジュールは、通常、以下のように実装されます。編集されるデータ要素がマスターファイルのレコード、更新、削除、追加であるとします。モジュールに渡されるパラメーターには、データとデータの種類を示す特別なパラメーターが含まれます。モジュールの最初の命令は、四つのコードセクションへの四方向分岐であることが考えられます。それは、マスターレコードの編集、更新レコードの編集、追加レコードの編集、および削除レコードの編集です。
しばしば、これら四つの機能も何らかの方法でモジュール内で絡み合っています。削除レコードが変更されて削除レコードの編集機能を変更する必要がある場合、この機能が他の三つと絡み合っていると問題が生じます。もし編集が真に独立しているならば、システムは各編集を別々のモジュールに置くことで単純化され、各実行でどの編集を行うかを決定する必要がなくなります。短く言えば、論理的結合は通常、修正が困難な巧妙なまたは共有コードを生じさせ、不必要なパラメーターの受け渡しを行います。
GPT-4.iconによるサンプル
code:ts
type DataRecord = {
type: 'master' | 'update' | 'addition' | 'deletion';
data: any;
};
function editData(record: DataRecord) {
switch (record.type) {
case 'master':
editMasterRecord(record.data);
break;
case 'update':
editUpdateRecord(record.data);
break;
case 'addition':
editAdditionRecord(record.data);
break;
case 'deletion':
editDeletionRecord(record.data);
break;
default:
throw new Error('Unknown record type');
}
}
フラグで実施する処理を分岐する
同時に実行することのない複数の処理が同じ関数内に存在する
利用者は、内部構造を知っている上で、フラグを渡す必要がある
例
code:ts
const fn = (flg: boolean) => flg ? a() : b()
PHPのarray_uniqueとかもこれか?
StringUtils
文字列を扱うという意味では同じだが、使うタイミングが全然異なる
「フラグを渡すこと」自体は悪いとは思わないが。
それが責務でかつインターフェースに有意味として現れているなら、別に「内部構造を知」らなくても、その関数の利用は可能である
「論理的凝集」の説明として「フラグを渡すやつ」というのは適切なのか?