質問

私はよく耳に賞賛の言語の枠組みを構築します。"との明示的に".ようにしていることです。目的の言語、フレームワーク。が隠さい。った場合には指定したすべての種類の詳細に明示的に、それが潜むことのないように多くの複雑さ、移動しするようにしてください。うに分かりやすさとはどのように書くでしょうか、言語の枠組み/API"明確"なのでその役目を隠複雑?

役に立ちましたか?

解決

それほどではありません 明示的 良いです(確かに密接に関連しています 冗長 悪いことです)そのように 暗黙 うまくいかない、WTFが進行中だと言うのはとても難しいです。

10年か2年間C ++をハックすると、私が意味することを正確に理解できます。

他のヒント

あなたが明示的であるべきか暗黙的であるべきかは、状況に依存します。あなたはしばしば複雑さを隠そうとしているので、あなたは正しいことであり、あなたのために自動的に舞台裏で行われている特定のことが良いことです。カプセル化など

時々フレームワークやコンストラクトは、彼らがすべきではないものを私たちから隠すことができます、そしてこれは物事を作ります 以下 クリア。特定の情報や設定が私たちから隠されている場合があるため、私たちは 何が起こっているのかわからない. 。私たちが理解できず、決定できないという仮定がなされています。予測できない行動が起こります。

カプセル化:良い。隠れて:悪い。適切な電話をかけるには経験が必要です。ロジックが属する場合、それは明示的でなければなりません。

例: 私は一度、ページの背後にある一連のコードから約90行のコードを削除しました。そこに属していなかったデータアクセスコード、ビジネスロジックなど。私はそれらをベースページと重要なビジネスオブジェクトに移動しました。これは。。。でした 良い (カプセル化、懸念の分離、コード組織、デカップリングなど)。

その後、これらのページの多くからコードの最後の行を削除し、ベースページに移動できることに興奮して気付きました。これは、URLからパラメーターを取得し、それをビジネスオブジェクトに渡した行でした。よかったよね?まあ、いや、これはそうでした 悪い (私はそうでした 隠蔽)。このロジックは、すべてのページでほぼ同じ行でしたが、ここに属していました。 UI意図をビジネスオブジェクトとリンクしました。そうする必要があります 明示的. 。そうでなければ、私は隠れていて、カプセル化していませんでした。その行で、そのページを見ている人は、そのページが何をしたのか、そしてその理由を知っているでしょう。それがなければ、何が起こっているのかを判断するのは苦痛です。

私は、明示的なことは、あなたがそれを使用するときにそれが何をしているかを正確に知ることを指していると信じています。それは、それがどのように行われるかを正確に知ることとは異なります。これは複雑な部分です。

それは意図を表現することです。読者は、デフォルトが間違っているのか、それとも設計によって残されているかを知ることができません。明示的であることはその疑いを取り除きます。

コードを書くよりも読みにくいです。自明でないアプリケーションでは、特定のコードが書かれているよりも頻繁に読み取られます。したがって、読者をできるだけ簡単にするために、コードを作成する必要があります。明らかではない多くのことを行うコードは、読むのは簡単ではありません(または、読んだときに理解するのは難しいです)。エルゴ、明示性は良いことと考えられています。

デフォルトの動作に依存すると、言語/フレームワークなどに精通していない人々から重要な詳細が隠されています。

略記に広く依存しているPerlコードを、Perlを知らない人にとって理解するのが困難であることを考えてください。

明示的であると暗黙的であることは、あなたが隠しているものとあなたが示すものについてのすべてです。

理想的には、ユーザーが気にかけているか、気にしなければならない(必要であるかどうか)概念を公開します。

明示的であることの利点は、特に失敗の場合に、追跡して何が起こっているのかを追跡して見つける方が簡単であることです。たとえば、ロギングを行いたい場合は、ログのディレクトリを使用して明示的な初期化が必要なAPIを使用できます。または、デフォルトを使用できます。

明示的なディレクトリを提供し、失敗した場合、その理由はわかります。暗黙のパスを使用して失敗した場合、何が間違っていたのか、なぜ、それを修正するためにどこを探すべきかについてはわかりません。

暗黙の行動は、ほとんどの場合、消費者からの情報を隠した結果です。あなたの環境で知っているときなど、それが正しいことであることがあります。ただし、情報を隠しているときとその理由を知ることが最善です。また、消費者が意図のレベルに近づき、本質的な複雑さのアイテムを隠そうとすることなく、確実にしてください。

頻繁に暗黙的な動作は、環境を見て正しい動作を推測しようとする「自己構成」オブジェクトの結果です。私は一般的にこのパターンを避けます。

おそらく全体的に従うルールの1つは、特定のAPIについて、すべての操作は明示的または暗黙的であるが、組み合わせではないことです。操作をユーザーがしなければならないことをするか、考えなければならないものにします。これら2つを混ぜると、最大の問題に遭遇します。

フレームワークなどは、ジョブを行うために適切な抽象化を提供することにより、明示的で複雑さを隠すことができます。

明示的であることで、他の人が元の開発者が何を意味するのかを検査して理解することができます。

隠す複雑さは、暗黙的であることと同等ではありません。暗黙の結果は、フードの下で何が起こっているのかを理解しようとしていると書いた人によってのみ理解できるコードをもたらします。この場合、エンジニアリングを逆にすることに似ています。

明示的なコードには、正しいことが証明される理論的なチャンスがあります。暗黙のコードは、この点でチャンスになることはありません。

明示的なコードは保守可能であり、暗黙的なコードはそうではありません - これは、正しいコメントを提供し、識別子を慎重に選択することにリンクします。

「明示的な」言語により、コンピューターは、明示的でない言語ではそうでないソフトウェアのバグを見つけることができます。

たとえば、C ++には const 値が変更されない変数のキーワード。プログラムがこれらの変数を変更しようとすると、コンパイラはコードが間違っている可能性が高いと述べることができます。

良い抽象化しない非表示の複雑さで決定することをコンパイラのプレート。

考えるごみの収集:複雑な放出源の委譲は、ガベージコレクタであると思われる)より良い資格が決定するプログラマを交換してください。なの決定はお手のものでよい。

分かりやすさは(も)良いですように一定の判断する場合には、プログラマのない動による修飾剤。れることができなければ、がんを宣言する浮動小数点データ型、c型言語を初期化する整数:

double i = 5.0;

もし代わりに使った宣言しまし

var i = 5;

コンパイラのよう然とすint、操業後にい切り捨てられます。

明示性は、コードの読者にあなたが意図したことを明確にするという文脈で望ましいです。

多くの例がありますが、それはあなたの意図について疑いの余地がないことです。

たとえば、これらはあまり明示的ではありません:

while (condition);

int MyFunction()

bool isActive;         // In C# we know this is initialised to 0 (false)

a = b??c;

double a = 5;

double angle = 1.57;

しかし、これらは次のとおりです

while (condition)
    /* this loop does nothing but wait */ ;

private int MyFunction()

int isActive = false;  // Now you know I really meant this to default to false

if (b != null) a = b; else a = c;

double a = 5.0;

double angleDegrees = 1.57;

後者のケースは、誤解の余地を残しません。前者は、誰かが注意深く読み取れない場合、または何かをするために読みやすい構文を明確に理解していない、または整数とフロートの種類を混同しない場合、バグにつながる可能性があります。

場合によっては、反対は「魔法」です - 「その後、奇跡が起こります」.

開発者の読書コードが何が起こっているのかを理解またはデバッグしようとしている場合、明示性は美徳になる可能性があります。

フレームワークが物事を動かす目的は、コードの重複を削除し、全体を壊すことなくチャンクの編集を容易にすることです。 sum(x、y)のように、何かをする方法が1つしかない場合。私たちはこれが何をしようとしているのかを正確に知っています。それを書き直す必要はありません。その逆は、非常に複雑な関数を提供する.NETのようなプログラミング言語です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top