コードとデータの分離はどのようにして実践になりましたか?


29

質問を注意深く読んでください:理由ではなく方法を尋ねます

私は最近、データベースを使用して不変データを保存することを提案するこの答えに出会いました:

あなたが説明するマジックナンバーの多くは、特にそれらが部品に依存している場合は、コードではなく実際にデータであるように聞こえます。[...] SQLタイプのデータベースを意味する場合もあれば、単にフォーマットされたテキストファイルを意味する場合もあります。

あなたのプログラムが行うことの一部であるデータがある場合、やるべきことはプログラムにそれを置くことだと私には思えます。たとえば、プログラムの機能が母音をカウントすることvowels = "aeiou"である場合、その中にあることの何が問題になっていますか?結局のところ、ほとんどの言語には、まさにこの使用のために設計されたデータ構造があります。上記のように、「フォーマットされたテキストファイル」にデータを配置することで、データ分離するのはなぜですか?選択したプログラミング言語でフォーマットされたテキストファイルを作成しないのはなぜですか?これはデータベースですか?それともコードですか?

これは馬鹿げた質問だと思う人もいるかもしれませんが、真剣に質問します。「変数に誤解を招く名前を付けないでください」や「あなたの言語が取るに足らない」。

たとえば、次の記事をご覧ください:データをPuppetコードから分離する際の問題問題?何の問題?Puppetがインフラストラクチャを記述するための言語である場合、ネームサーバーが8.8.8.8であることも記述できないのはなぜですか?問題はコードとデータが混在しているということではないように私には思える1が、人形は十分に豊富なデータ構造や他のものにインタフェースする方法を欠いていること。

このシフトが邪魔だと思います。オブジェクト指向プログラミングでは、「任意にリッチなデータ構造が必要」と言われたため、コードの力をデータ構造に付与しました。その結果、カプセル化と抽象化が行われます。SQLデータベースにもストアドプロシージャがあります。コードから腫瘍を取り除くかのように、データをYAMLまたはテキストファイルまたはダムデータベースに隔離すると、そのすべてが失われます。

コードからデータを分離するこのプラクティスがどのようになったのか、そしてそれがどこに向かっているのか、誰でも説明できますか?誰もが著名人による出版物を引用したり、「データからコードを分離する」ことを新たな戒めとして示し、その起源を示す関連データを提供できますか?

1:そのような区別さえすることができれば。Lispプログラマーを探しています。


5
選択した言語ですべてのHTMLとCSSを自由に埋めてください。
ジェフ14

3
引用の著者が意味したのは、マジックナンバーが本当に不変ではないということだと思います。
ピーターB 14

4
母音のハードコーディングに問題はありません。アプリケーションが母音を英語で数えるためだけに使用される場合。
マイケルポールコニス14

3
コードとデータを分離する大きな技術的理由は、データが変更されたときにコードを再コンパイルする必要がないことです。したがって、スクリプト言語にも同じ程度に当てはまるのか疑問に思います。
user16764 14

1
@MichaelPaulukonis:それをデータベースに入れることは偽の解決策です。オランダ語に変更が必要ですか?ゼロ(DBの変更でもない)。フランス語/ドイツ語に変更が必要ですか?少なくともISO-8859-1サポート。(DB以上)。ギリシャ語/ロシア語に変更が必要ですか?Unicodeサポート(DB以上)。実際、そのDBが役立つ言語は考えられません。
MSalters

回答:


22

データをコードから分離するのには多くの正当な理由があり、そうでない理由もあります。以下が思い浮かびます。

適時。データ値はいつわかりますか?コードの作成時、コンパイル時、リンク時、リリース時、ライセンス交付時、構成時、実行開始時、または実行中です。たとえば、1週間の日数(7)は早くわかりますが、USD / AUDの為替レートはかなり遅れてわかります。

構造。これは、単一の考慮事項に従って設定された単一のデータ時間ですか、それとも継承されるか、アイテムのより大きなコレクションの一部ですか?YAMLやJSONなどの言語では、複数のソースからの値を組み合わせることができます。おそらく、最初は不変と思われるもののいくつかは、構成マネージャーのプロパティとしてアクセス可能にした方が良いでしょう。

局所性。すべてのデータ項目が限られた数の場所に保存されている場合、特に一部を新しい(不変の)値に変更する必要がある場合は、管理がはるかに簡単です。データ値を変更するためだけにソースコードを編集すると、不注意による変更やバグのリスクが生じます。

関心事の分離。アルゴリズムを正しく機能させることは、使用するデータ値の考慮から分離するのが最適です。データは、アルゴリズムの一部ではなく、アルゴリズムをテストするために必要です。http://c2.com/cgi/wiki?ZeroOneInfinityRuleも参照してください

あなたの質問に対する答えとして、これは新しいことではありません。核となる原則は30年以上も変わらず、その間繰り返し書かれてきました。このトピックに関する主要な出版物は、一般的に物議を醸すとは考えられておらず、新参者に説明するだけのものであるため、思い出せません。ビットは、よりここにあります:http://c2.com/cgi/wiki?SeparationOfDataAndCode

私の個人的な経験では、特定のソフトウェアにおけるこの分離の重要性は、時間の経過とともに大きくなります。ハードコーディングされた値はヘッダーファイルに移動され、コンパイルされた値は構成ファイルに移動され、単純な値は階層構造および管理構造の一部になります。

トレンドについては、プロのプログラマーの間で態度に大きな変化は見られませんでした(10年以上)洞察力が、時々無知から。


2
この慣行の歴史と動向を詳しく教えてください。誰もがこれらの考慮事項を与えた場合、私は質問をしていないでしょう。質問の前提は、人々がデータの行き先(コンパイル済み定数、外部データベース、YAML ...)を慎重に検討しているのではなく、むしろ「コードとデータが混在している悪い!なぜまたはいつこれが問題になったのですか?
フィルフロスト14

それは私の経験の一部ではないので、私はあなたに伝えることができません。回答にいくつかのパラを追加しました。
david.pfx 14

「若者の流入」は有効な説明だと思いますが、これらの若者の何人かから意見を聞いてもらいたいので、私は受け入れを控えています。明らかに彼らは「別々のコードとデータ」の部分を手に入れたが、私は彼らが残りを手に入れたとは思わない。彼らはブログ投稿でそれを読みましたか?一冊の本?どこで、いつ?
フィルフロスト14

常に「_____ BAD!HULK SMASH!」を受け取ります。-それは本当だという意味ではありません。多くの場合、この種のこと(たとえば、「 'GOTO' BAD!HULK SMASH!」)は、初心者に、理由や例外を教えずに、初心者に教えられます。
アマダノン株式会社14

Localityまた、逆に機能します:さまざまなクライアントのカスタム要件のために、プラグインタイプのシステムになり、数年の試行錯誤を通して、定数を維持することを学んだデータベースおよびコード内。どちらも、「プラグイン」以外の場所で使用することと、変更が発生すると変更が自動的にバージョン管理されるためです。
イズカタ14

8

データは非常によくスケーリングされ、コードから分離されている場合は、クエリと変更をより簡単に行うことができます。データが本質的にコディッシュである場合(たとえば、データがルールまたはコマンドを表している場合)でも、そのコードを構造化データとして表現して保存できる場合、個別に保存するメリットを享受できます。

許可

データがハードコーディングされている場合、そのデータを編集するにはソースファイルを編集する必要があります。つまり、次のいずれかです。

  • 開発者のみがデータを編集できます。これは悪いことです。データ入力は開発者のスキルと知識を必要とするものではありません。

  • 開発者以外はソースファイルを編集できます。これは悪いことです-彼らはそれを知らずにソースファイルを破壊するかもしれません!

  • データは個別のソースファイルにハードコーディングされており、開発者以外のユーザーはそれらのファイルにのみアクセスできます。しかし、これは実際にはカウントされません-データはコードから分離され、独自のファイルに保存されます...

編集

したがって、がデータを編集できるかに関しては、個別に保存するのが最善です。データの編集方法はどうですか?大量のデータがある場合、手で入力するのは面倒でエラーを排除します。このためのUIがあれば、はるかに優れています。それでもすべてを入力する必要がある場合でも、フォーマットのボイラープレートを入力する必要はありません。そのため、フォーマットを台無しにしてファイル全体を壊してしまう可能性は低くなります。

データがハードコーディングされている場合、そのUIを作成すると、自動化されたツールが手書きのソースファイルを編集することになります。自動化されたツールがソースファイルを開き、データの場所を見つけようとし、そのコードを変更します。Brrr ... Microsoftは、これらのことを避けるために、C#に部分クラスを導入しました...

データが個別の場合、自動化ツールはデータファイルを編集するだけです。データファイルを編集するコンピュータープログラムは、最近ではそれほど珍しいことではないと思います...

スケーリング

コードとデータのスケールは大きく異なります。コードが大きくなると、コードをより多くのクラスとメソッド(またはデータ構造と関数)に分割しますが、データは(いくら大きくても)1か所に保持します。それを複数のファイルに分離する必要がある場合でも、それらのファイルを何らかの方法でまとめたいので、コードからそのデータに簡単にアクセスできます。

したがって、ソースファイル内に数千行のデータがあるとします。コンパイラ/インタープリターは、ファイルを読み取るたびにすべてのデータを調べ、高価なレクサーとパーサーで解析する必要があります-プログラムのこの特定の実行でそのデータにアクセスしない場合でも。また、そのファイルの実際のコードを編集するときは、データを処理する必要があるため、プロセス全体が面倒です。また、データファイルにインデックスを付けることができます。ハードコードされたデータ?そんなにない...

探している

大量のデータがあります-それを検索するのは当然のことです。

  • データベースに保存する場合-データベースクエリ言語を使用できます。

  • XMLファイルに保存する場合-XPathを使用できます。

  • JSON / YAMLで保存する場合は、お気に入りのスクリプト言語のREPLに読み込んで検索できます。

  • プレーンテキストファイルに保存する場合でも、プログラムが認識できる構造を持っているため、grep / sed / awkを使用して検索できます。

ソースファイルのハードコードされたデータをgrep / sed / awkすることもできますが、クエリは他の無関係な行と一致したり、異なる方法で記述された行をミスしたりする可能性があるため、うまくいきませんプログラミング言語のデータ表現構文で許可されています。

コードを検索するためのツールはありますが、ハードコードされたデータではなく、宣言を見つけるのに適しています。

言われていること...

データとコードを区別することは非常に重要です。何かがコードとして書かれているからといって、それがデータになれないというわけではありません。そして、何かがデータ表現で書かれているからといって、実際にはコードではないというわけではありません。

「マジックナンバー」について非常に厳しいルールがあったときにクラスがありました。コードに数字を含めることはできませんでした。つまり、次のようなことをしなければなりませんでした。

#define THE_NUMBER_ZERO 0
//....
for(int i=THE_NUMBER_ZERO;i<cout;++i){
//....

まったくばかげている!はい、0技術的には「データ」ですが、forループの残りの部分と同じようにコードの一部です!だから我々は、にもかかわらずできるデータとしてそれを表現し、私たちが意味するものではありませんコード、から分離すべきです。コード内にデータを残したいのではなく、実際にはデータではないため-1と0にコンパイルされる残りのコードよりも多くないため...


7

混乱が起こっていると思います。「コードとデータの分離」と「プログラムの動作をデータとして表現する」という2つのことを組み合わせています。

あなたの場合、実際には2番目のものと最初のものを混ぜることが心配です。プログラムの動作をデータとして表現すると、拡張が容易になります。の例ではvowels = "aeiou"、新しい母音の追加は文字の追加と同じくらい簡単です。このデータが外部にある場合、プログラムを再コンパイルせずにこの動作を変更できます。

そして、あなたがそれについて考えるとき、OOPはこの考え方の延長です。データと動作を一緒にバインドすると、プログラムのデータに基づいてプログラムの動作を変更できます。


2
当然、母音のリストは変更されます。
cHao 14

13
@cHao i18nが介入するとすぐにそうなります
モニカの

2
i18nは頭を痛める
ロリーハンター

2
@Angew:i18nが入ってすぐに、とにかくねじ込まれます。これにはコードが必要です。ナイーブソリューションでは、英語でもすべてのケースを処理できません。(忘れï;約ましょう話秒間yとしwこれを修正するつもりはないされているデータベースにリストを移動し、実際に有害である-無益完了間違っているかのだろう、それの複雑さを、しかし、あなたはしません!)i18n向けにゼロから設計しているのない限り、「間違った」とは何かを知っている。この時点で、母音のリストはそれでもとにかくカットされないことにすでに気付いています。
cHao 14

1
@BenLee:実際、少し驚かないでしょう。現在、そのようなコードを変更する作業を行っています。しかし、すべてをデータベースにアウトソーシングすることは、まったく別の種類の占いです。何かを変更する必要があるかどうかがまだわからない場合、さらに重要なことですが、まだどのように変更する必要があるわからない場合は、IMOを追加する前にその柔軟性が必要になるまで待つ方が良いでしょう。
cHao 14

5

たとえば、プログラムの機能が母音をカウントすることである場合、その中に母音= "aeiou"があると何が問題になりますか?

構成を外部に保存すると、多くの構成で動作することが期待されるコードの1つのバージョンを使用できますが、代替手段は、構成のみが異なるソフトウェアの多くのバージョンを維持することです。

母音= "aeiou"に言及していますが、 "y"が必要な場合は、プログラム全体を再構築する必要がありますか?コードを変更したので、簡単にバージョンをアップグレードできますか?エラーがある場合、それを引き起こしましたか、またはプログラムが壊れていますか?

これがプログラム内にある場合、プログラムがユーザーに母音の定義を変更することを期待していないことを意味し、コードをスキャンして副作用を確認します。定義が外部に保存されている場合、構成で設定された妥当な値に対してプログラムが中断しないことを意味します。

コードから腫瘍を除去するように、YAML、テキストファイル、またはダムデータベースにデータを隔離する場合

反対の見方をする人もいます。つまり、貴重なデータからコードの腫瘍を取り除いているのです。優れたプログラマーに関するトーバルズの引用


4
Torvaldsの引用は、データではなくデータ構造を指します。
user949300 14

OPは次のよ​​うに述べています。「オブジェクト指向プログラミングでは、「任意のリッチデータ構造が必要」と言われたため、データ構造にコードの力を与えました。」
FMJaguar

1
母音の定義に根本的な変更を加えた場合、すべての自動テストを再実行する必要があります。展開されたシステムで構成ファイルが変更されたときに、システムがテストを再実行することはほとんどありません。そのため、そのような定義をシステムに組み込む必要があります。おそらく、それらを選択する構成オプションを備えた2つのハードコードされたセットとして。
soru

トーバルズの引用に対して+1。私はこの感情に同意します。人形の例では、問題は人形が人々が入れたい情報を表現するための良いデータ構造を持っていないことだと思います。パペット開発者は、データ構造を修正するのではなく、「コード内のデータ」が問題であると主張し(なぜですか?それが問題です!)hieraを開発しました。行動とデータを関連付けるため。
フィルフロスト14

2

私は、リードが参照データを小さなテーブルに入れることを主張するプロジェクトに参加しましたが、それはばかげていると思いました。ただし、永続性インフラストラクチャと接続が既に設定されているため、他の永続化操作に比べてかなり低コストになりました。

今、私はまだそれは愚かな決断だったと思う、と私たちは場合はなかった一方で、インフラストラクチャを持って、私はちょうどそれをしなかったでしょう。

しかし、私が見る賛成論のいくつかは次のとおりです。

  • データベースの考え方がある場合は、参照データをSQLデータベースに入れると、レポートのために参照データに参加できます。
  • 管理ユーティリティがある場合、またはデータベースにアクセスできる場合は、実行時に値を調整できます。(それは火で遊ぶことができますが。)

また、ポリシーがコーディング慣行の邪魔になることもあります。たとえば、.xmlファイルのプッシュがA-OKであるいくつかのショップで働いたことがありますが、コードの行に触れるには完全な回帰サイクルと、おそらく負荷テストが必要です。そのため、プロジェクトの.xmlファイルが非常に豊富であった(そしておそらく-heh-にコードが含まれていたかもしれない)チームが1つありました。

単なるテキストファイルであっても、コードからデータを外部データストアにプッシュするメリットを享受するかどうかを常に自問しますが、そのように見ている人とは最初からやりました衝動。


3
XMLの編集は「OK」ですが、コード内で同じことを編集するのは大きな面倒です。
user949300 14

1つのショップで働いていましたが、そこにはすべてがデータベースにあり、画面のテキストまでありました。別に、ユーザインタフェースコードからではなく、データベース内で唯一のものは、データベースの場所と資格...だった
jwenting

3
いつか誰かが「それを要求しているユーザーXのためにこれを再設定できますか」と尋ねるまで馬鹿げたように聞こえます。くそー顧客:)
gbjbaanb 14

2
...その日は「決して」ではない場合は、愚かな長い時間の感覚だ
ロブ・

2

完全に真剣な反論をお願いします。あなたの見解では、「データ」と「コード」の違いは何ですか?

「データ」という言葉を聞くと、「状態」と思う。データは、定義上、アプリケーション自体が管理するように設計されたものであり、したがって、アプリケーションはコンパイル時に決して知ることができないものです。それはない可能ではないデータ-すぐにハードコードそれと同じくらい、それが行動になるので、ハードコードデータへ。

データのタイプはアプリケーションによって異なります。商用の請求システムは顧客と注文の情報をSQLデータベースに保存し、ベクトルグラフィックプログラムはジオメトリデータとメタデータをバイナリファイルに保存します。これらのケースとその間のすべてにおいて、コードとデータの間には明確で壊れない分離があります。データはプログラマではなくユーザーのものであるため、ハードコーディングすることはできません。

あなたが話しているように見えるのは、私の現在の語彙で利用可能な最も技術的に正確な説明を使用することです。アプリケーションの大部分を開発するために使用される主要プログラミング言語で書かれていないプログラムの動作を管理する情報です。

「データ」という言葉よりもかなり曖昧ではないこの定義でさえ、いくつかの問題があります。たとえば、プログラムの重要な部分がそれぞれ異なる言語で書かれている場合はどうなりますか?私は個人的に、約50%のC#と50%のJavaScriptであるいくつかのプロジェクトに取り組んできました。JavaScriptコードは「データ」ですか?ほとんどの人はノーと言うでしょう。HTMLはどうですか、その「データ」ですか?ほとんどの人はまだノーと言うでしょう。

CSSはどうですか?そのデータまたはコードですか?コードをプログラムの動作を制御するものと考えると、CSSは実際にはコードではありません。動作にではなく、外観にのみ影響を与えるからです。しかし、実際にはデータでもありません。ユーザーはそれを所有しておらず、アプリケーションも実際には所有していません。UIデザイナーのコードに相当します。それはコードのようなものですが、完全なコードではありません。

私はCSSを一種の構成と呼ぶかもしれませんが、より実用的な定義は、ドメイン固有の言語の単なるコードであるということです。XML、YAML、およびその他の「フォーマットされたファイル」がよく表すものです。ドメイン固有の言語を使用する理由は、一般的に言えば、CやC#、Javaなどの汎用プログラミング言語で同じ情報をコーディングするよりも、特定のドメインで同時に簡潔で表現力が高いためです。

次の形式を認識していますか?

{
    name: 'Jane Doe',
    age: 27,
    interests: ['cats', 'shoes']
}

ほとんどの人がそうしていると確信しています。それはだJSON。JSONの興味深い点は次のとおりです。JavaScriptでは、明らかにコードであり、他のすべての言語では、明確にフォーマットされたデータです。ほとんどすべてのメインストリームプログラミング言語には、JSONを「解析」するためのライブラリが少なくとも1つあります。

JavaScriptファイルの関数内でまったく同じ構文を使用する場合、コード以外のものは使用できません。それでも、そのJSONを.jsonファイルに入れ、Javaアプリケーションで解析すると、突然「データ」になります。それは本当に理にかなっていますか?

私は、「データ性」または「構成性」または「コード性」は、それがどのように記述されているかではなく、記述されているものに固有であると主張します。

たとえば、ランダムパスフレーズを生成するために、プログラムに100万語の辞書が必要な場合、次のようにコーディングしますか。

var words = new List<string>();
words.Add("aa");
words.Add("aah");
words.Add("ahhed");
// snip 172836 more lines
words.Add("zyzzyva");
words.Add("zyzzyvas");

または、これらのすべての単語を行区切りのテキストファイルに押し込み、プログラムからそのファイルから読み取るように指示しますか?単語リストが変更されないかどうかは問題ではなく、ハードコーディングまたはソフトコーディング(不適切に適用された場合にアンチパターンであると多くの人が正しく考えている)かどうかの問題ではなく、単に最も効率的な形式であり、「スタッフ」が何であれ、「スタッフ」を最も簡単に記述することができます。コードまたはデータと呼ぶかどうかは、かなり無関係です。それはプログラムが実行するために必要な情報であり、フラットファイル形式はそれを管理し維持するための最も便利な方法です。

あなたが適切な慣行に従うと仮定すると、このようなものはすべてソース管理に入るので、それをコードと呼んでもよいでしょう。または、構成と呼ぶこともできますが、コードを構成と真に区別する唯一のことは、文書化してエンドユーザーに変更方法を伝えるかどうかです。おそらく、コンパイル時ではなく、起動時または実行時に解釈される構成に関する偽の引数を発明できますが、その後、いくつかの動的に型付けされた言語、およびほぼ確実にスクリプトエンジンが埋め込まれたものについて記述し始めますほとんどのゲーム)。コードと構成は、それらにラベルを付けることを決定したものであり、それ以上でもそれ以下でもありません。

今、そこにあるの危険外在実際に変更することは安全ではない情報は、(上記の「ソフトコーディング」のリンクを参照してください)。母音配列を構成ファイルで外部化し、それを構成ファイルとしてエンドユーザーに文書化する場合、たとえば「q」を母音として入力するなど、アプリを即座に中断するほぼ確実な方法を提供します。しかし、それは「コードとデータの分離」の根本的な問題ではなく、単に悪い設計センスです。

私がジュニア開発者に伝えることは、彼らが環境ごとに変更すると予想される設定を常に外部化する必要があるということです。これには、接続文字列、ユーザー名、APIキー、ディレクトリパスなどが含まれます。彼らは可能性があなたのdevのボックスに、生産で同じで、おそらくない、とシステム管理者は、彼らはそれがない開発者、生産で見てみたい方法を決定します。そのため、一部のマシンに1つの設定グループを適用し、他のマシンに他の設定を適用する方法が必要です-エルゴ、外部構成ファイル(またはデータベース内の設定など)

しかし、単に「データ」を「ファイル」に入れることは、それを構成として外部化することと同じではないことを強調します。単語の辞書をテキストファイルに入れることは、ユーザー(またはIT)がそれを変更することを意味するのではなく、開発者が地獄が何をているのかを理解し、必要に応じて、時折の変更。同様に、テーブルが読み取り専用である場合、および/またはDBAに絶対に干渉しないように指示されている場合、データベーステーブルに同じ情報を入れても、必ずしも行動の外部化としてカウントされません。構成とは、データが変更可能であることを意味しますが、実際には、形式の選択ではなくプロセスと責任によって決定されます。

要約すると、

  • 「コード」は厳密に定義された用語ではありません。定義を拡張して、ドメイン固有の言語や、動作に影響を与える他のものを含めると、この明らかな摩擦の多くは単純に消え、すべて意味があります。フラットファイルには、コンパイルされていないDSL「コード」を含めることができます。

  • 「データ」とは、ユーザーまたは少なくとも開発者以外の誰かが所有し、設計時には一般に入手できない情報を意味します。あなたがそうしたい場合でも、ハードコーディングすることはできません。自己修正コードの例外を除き、コードとデータの分離は定義の問題であり、個人の好みではありません。

  • 「ソフトコーディング」は過剰に適用されるとひどい習慣になる可能性がありますが、外部化のすべてのインスタンスが必ずしもソフトコーディングを構成するとは限りません。

  • 構成は、アプリケーションが異なる環境で実行する必要があるかもしれないという知識あるために必要な特別なタイプのソフトコーディングです。アプリケーションとともに別個の構成ファイルをデプロイすることは、異なるバージョンのコードをすべての環境にデプロイするよりもはるかに少ない作業(およびはるかに少ない危険)です。したがって実際にはいくつかのタイプのソフトコーディングが便利です。


1

Oren Eini(別名Ayende Rahien)によるこの古典的な記事を読むことをお勧めします

http://ayende.com/blog/3545/enabling-change-by-hard-coding-everything-the-smart-way

それからの私自身の持ち帰りは、シンプルさと読みやすさに焦点を当てることです。これは、再構成されそうにないものは、ハードコードされた状態で(読みやすいように)残しておくことが最適であることを意味します。これにより、プログラミング言語の完全な構文を使用してパラメーターを表現できるだけでなく、コード補完や誤用時のコンパイラエラーなどの有益な副作用を得ることができます。

このように、解析/解釈の複雑さを潜在的に回避し(「しかし、誰かが私のYAML / JSONを解析する」-解析されたテキストを特定のAPI呼び出しにマッピングすることは解釈の形式である)、「データ間の別のステップの複雑さを回避する」とその使用。

このようなシナリオでも、データで表現される場合があります。たとえば、3D空間で数千のポイントを指定すると、コードよりもテキストファイルに適している場合があります。その場合でも適切です。


1

では、余暇のために何らかの種類のC ++プログラムを作成するとします。あなたはそれが何をしなければならないか、そしてそれが決してする必要がないことを正確に知っています。ここで、「最新のソフトウェア設計」に関する本を取ります。ゲームのルールは次のとおりです。コードを「クリーンデザイン」にするためには、プロジェクト内のすべてのクラス、および非常に小さな場合でも、その本で説明されているファンシーパターンをすべて実装する必要があります。まあ、多くの人々にとって「依存性注入」で十分だと思います。(Javaではなくc ++です!)プログラミングは、ますます理論的な観点から教えられています。仕事を成し遂げるだけでは不十分です。保守可能なコードを書かなければなりません。問題はpplから始まります。実際の理由について考えるのをやめ、設計パターンが発明され、独断的になりました。

特定のタイプの入力データに対して特定のジョブを実行するコードを書くときは、特定の入力に対してそのタスクを実行できることを確認してください。そのタイプのデータ。-文字カウントツールを作成する場合、母音だけでなく「任意の文字」もカウントできるように、ある意味でそれを書くことは明らかに理にかなっています。-解析しているコーパスが実際には何なのかわからない場合があるため、非常に一般的なエンコード(UTF-16)を選択し、ほとんど(すべて?)の記述言語とその記号をカバーすることもできます。

その時点までに、2つの引数(コーパスとカウントされる文字)を持つ関数があります。私たちは、文字が属する合理的に一般的な「タイプ」または「クラス」を見つけることだけに関心があります。私たちは確かにASCIIシンボルよりもうまくやることができます!

「一般化と再利用性」という教義を振るう悪魔を入力してください。-そのクラスの入力ストリームにあるクラスのシンボルをカウントしないのはなぜですか。(文字から任意の長さの任意のビットシーケンスへの抽象的ですが、それはコンピューターで取得できる最も一般的なものです...)-待ってください、それでも自然数でカウントしています。しかし、カウントは、公理を満たすカウント可能セットからそれ自体へのマッピングとして一般化することができます... [アイデアを得る]

今ではその例はばかげているかもしれませんが、カウントツールよりも複雑なデザインタスクを検討する場合、本で見つけたある種のデザインパターンに従って必要な追加の抽象化を導入する機会を見つけるでしょう。

「データ」と「コード」の分離は、おそらく些細なこと(関数の引数)か、不変式を変数(「データ」)として扱うことになります。

混乱が生じた場合、「インターフェイス」と「サービス」、およびすべてのクラスの詳細(タイプなど)が突然「データ」になり、外部から注入される依存関係になる可能性があります。大学で教えられる情報学コースは哲学の講義のようになり、学生が機能するソフトウェアを作成する方法を体験できるように、実際のプロジェクトの時間が少なくなっていると感じています。明らかな解決策の代わりにめちゃくちゃ複雑なパターンを使用する必要があるのか​​疑問に思った場合、この開発は(おそらく)その要件が「作成された」方法です...

あなたの特定の問題に対して:1.)特定のケースに対して最大のハードコーディングを備えたプログラムを作成し、次に2.)によってそのコードから簡単な方法で一般化することができる場合。より多くの関数引数を導入し、他の「簡単なパターン」を使用すると、関数型プログラミングが発明されて以来行われてきたように、コードとデータを明確に分離することができます。(1をスキップして2を即座に行う...)

ここで非自明なものは、おそらく「理論上のデッドロック」の場合です:インターフェースとさらに別のインターフェースを参照するインターフェースを記述するようなものです...そして、class-interface-clutterに注入される依存関係。

願っていますが、必要なxml-parserは動作するためにxml-configを必要としません...

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.