1727112978
2024-09-23 12:33:05
暗黙の表現は1分あたりのWTFを高めると確信している (WTFPM) 長期的には。
暗黙性は、コーダーに 隠された詳細を覚えておく コード内で明確に定義するのではなく、たとえば、ここに「10」を追加する理由を教えていただけますか?
// Implicit (bad)
function calculateSalary(a, b) {
return a + b + 10; // WTF is 10?
}
まさに、それがポイントでした。「10」が何を表しているかは、それを書いた人以外には誰にもわかりません。これはひどいことだと私は思います。プロジェクトに取り組んでいるエンジニアのチームがある場合、そのような曖昧さのあるコードベースを誰がナビゲートできるでしょうか?
暗黙的に「10」を追加する代わりに、ボーナス用の明確な変数を作成するだけで、将来の頭痛の種を防ぐことができます。私の考えでは、暗黙的な動作に過度に依存すると混乱が生じ、コードベースの管理が困難になる可能性があります。
// Explicit (good)
function calculateSalary(a, b) {
const bonus = 10;
return a + b + bonus;
}
ティム・ピーターズの2点目 Pythonの禅 「明示的であることは暗黙的であることよりも優れている」と述べられており、私も全く同感です。
ユーザーの役割に基づいてシステムのさまざまな部分へのアクセスを許可する関数を想像してください。この例では、暗黙的な動作によって、どの役割にどの権限があるかが混乱し、コードの保守が困難になります。
// Implicit (bad)
function grantAccess(user) {
if (user.role === 'admin') {
return ['read', 'write', 'delete']; // Full access
}
if (user.role === 'editor') {
return ['read', 'write']; // Editors can't delete
}
if (user.role === 'viewer') {
return ['read']; // View-only access
}
// Implicit fallback
return ['none']; // WTF is 'none'?
}
function showAccessControls(user) {
const permissions = grantAccess(user);
if (permissions.includes('read')) {
console.log("User has read access.");
}
if (permissions.includes('write')) {
console.log("User has write access.");
}
if (permissions.includes('delete')) {
console.log("User has delete access.");
}
}
// Example usage
const user1 = { name: "Alice", role: "admin" };
const user2 = { name: "Bob", role: "viewer" };
const user3 = { name: "Charlie", role: "guest" }; // Implicit 'none' fallback
showAccessControls(user1); // Has all access
showAccessControls(user2); // Read-only access
showAccessControls(user3); // No access, but why?
アクセス制御は、ハードコードされたロールと「なし」などのマジックストリングで処理されるため、ロールが追加されるにつれて不明瞭になり、管理できなくなります。権限がコード全体に分散しているため、将来の開発者にとって混乱やメンテナンスの問題が発生します。
// Explicit (good)
const ROLE_PERMISSIONS = {
admin: ['read', 'write', 'delete'],
editor: ['read', 'write'],
viewer: ['read'],
guest: [] // Explicitly defining guest permissions
};
function grantAccess(user) {
const permissions = ROLE_PERMISSIONS[user.role] || ROLE_PERMISSIONS['guest'];
return permissions;
}
function showAccessControls(user) {
const permissions = grantAccess(user);
if (permissions.includes('read')) {
console.log(`${user.name} has read access.`);
}
if (permissions.includes('write')) {
console.log(`${user.name} has write access.`);
}
if (permissions.includes('delete')) {
console.log(`${user.name} has delete access.`);
}
if (permissions.length === 0) {
console.log(`${user.name} has no access.`);
}
}
// Example usage
const user1 = { name: 'Alice', role: 'admin' };
const user2 = { name: 'Bob', role: 'viewer' };
const user3 = { name: 'Charlie', role: 'guest' };
showAccessControls(user1); // Alice has read, write, and delete access.
showAccessControls(user2); // Bob has read access.
showAccessControls(user3); // Charlie has no access.
明示的な方がよい理由
-
明示的なマッピング: の
ROLE_PERMISSIONSオブジェクトは各ロールとそれに対応する権限を明確に定義します。 -
明瞭度: 権限を明示的にすることで、コードベース全体に魔法の文字列や条件を散在させる必要がなくなります。
-
保守性: 将来の役割や権限の変更は、1 か所で簡単に更新できます。
私の意見では、「明示的は暗黙的よりも優れている」とは、簡潔だが曖昧になる可能性のある代替案よりも、明確で直接的なコードを選択することです。この原則は、多少冗長なコードを書くことになっても、読みやすさと保守性を最優先します。
明示的にすることで、コードの背後にある意図が明らかになり、開発者がコードベースを理解して操作しやすくなります。
#明示的は暗黙的よりも優れている