8

私は学生にプログラミングを教えています/手伝っています。

私が始めたとき、次のプロセスが常に私を助けたことを覚えています。それはかなり直感的に見え、他の誰かが同様のアプローチをとったのではないかと思います.

  1. 問題を読んで理解してください (もちろん)。
  2. 可能な「関数」と変数を特定します。
  3. どのようにそれを行うかを段階的に書いてください (アルゴリズム)
  4. それをコードに変換し、できないことがあれば、それを実行する関数を作成し、動き続けます。

時間と練習を重ねるうちに、問題の記述からコーディングの解決策に移行するのがいかに大変だったかを忘れてしまったようですが、この方法を適用することで、なんとかプログラミングの方法を学ぶことができました。

したがって、次のようなプロジェクトの説明の場合:

システムは、次のルールに基づいてアイテムの価格を計算する必要があります (ルールの説明... クライアント、割引、在庫状況など)。

最初のステップは、問題が何であるかを理解することです。

次に、アイテム、ルール、変数などを識別します。

次のような疑似コード:

function getPrice( itemPrice, quantity , clientAge, hourOfDay ) : int 
   if( hourOfDay > 18 ) then
      discount = 5%

   if( quantity > 10 ) then
      discount = 5%

   if( clientAge > 60 or < 18 ) then
      discount = 5%


        return item_price - discounts...
end

そして、それをプログラミング言語に渡します..

public class Problem1{
    public int getPrice( int itemPrice, int quantity,hourOdDay ) {
        int discount = 0;
        if( hourOfDay > 10 ) {
             // uh uh.. U don't know how to calculate percentage... 
             // create a function and move on.
            discount += percentOf( 5, itemPriece );
            .
            .
            .
            you get the idea..

        }
     }
    public int percentOf( int percent, int i ) {
             // .... 
    }


}

あなたは似たようなアプローチを取りましたか?.誰かがあなたに似たようなアプローチを教えましたか、それともあなた自身を発見しましたか (私がしたように :( )

4

13 に答える 13

11

私はテスト駆動型アプローチを採用しています。

1. 問題のニーズを満たすテストまたは仕様のリストを (紙またはプレーン テキスト エディターに) 書き留めます。

- simple calculations (no discounts and concessions) with:
    - single item
    - two items
    - maximum number of items that doesn't have a discount
- calculate for discounts based on number of items
    - buying 10 items gives you a 5% discount
    - buying 15 items gives you a 7% discount
    - etc.
- calculate based on hourly rates
    - calculate morning rates
    - calculate afternoon rates
    - calculate evening rates
    - calculate midnight rates
- calculate based on buyer's age
    - children
    - adults
    - seniors
- calculate based on combinations
    - buying 10 items in the afternoon

2. 最も簡単に実装できると思われる項目を探して、それに対するテストを作成します。たとえば、単品は簡単に見えます

Nunit と C# を使用したサンプル。

[Test] public void SingleItems()
{
    Assert.AreEqual(5, GetPrice(5, 1));
}

以下を使用して実装します。

public decimal GetPrice(decimal amount, int quantity)
{
    return amount * quantity; // easy!
}

次に、2 つの項目に進みます。

[Test]
public void TwoItemsItems()
{
    Assert.AreEqual(10, GetPrice(5, 2));
}

実装は引き続きテストに合格するので、次のテストに進みます。

3. 常に重複に注意し、削除してください。すべてのテストに合格し、テストのことを考えることができなくなったら完了です。

これは、最も効率的なアルゴリズムを作成することを保証するものではありませんが、何をテストするかを知っていて、すべて合格する限り、正しい答えを得ることは保証されます.

于 2008-09-26T02:52:43.553 に答える
5

古い学校のオブジェクト指向の方法:

  • 問題の説明とその解決策を書き留める
  • 名詞を丸で囲みます。これらは候補オブジェクトです
  • 動詞の周りにボックスを描きます。これらはメッセージの候補です
  • アクションを「実行」する名詞で動詞をグループ化します。助けるために必要となるその他の名詞を挙げてください
  • noun.verb(other nouns) の形式を使用して解決策を言い換えることができるかどうかを確認してください
  • コード化する

[この方法は CRC カードに先行しますが、あまりにも長い (20 年以上) ため、どこで学んだか覚えていません]

于 2008-09-26T03:29:19.427 に答える
4

プログラミングを学ぶとき、TDD は役に立たないと思います。TDD は、後でプログラミングとは何かについてある程度の概念ができたときに役立ちますが、最初は、コードを記述し、可能な限り短いターン アラウンド タイムで結果を確認できる環境を用意することが最も重要です。

問題文からコードに即座に移行します。それをハックします。学生がソフトウェアを構成したり、アルゴリズムを構造化するさまざまな方法を理解できるようにします。考えを変えてコードを作り直すよう生徒に教えます。コードの美学について少し教えてみてください。

彼らがコードをハッキングできるようになったら....その後、リファクタリングの観点から正式な再構築のアイデアを導入します。次に、プロセスをもう少し堅牢にする方法として TDD のアイデアを紹介します。しかし、やりたいことを実行するためにコードを操作することに慣れているのは 1 回だけです。テストを指定できることは、その段階でいくらか簡単になります。その理由は、TDD はデザインに関するものだからです。学習するときは、デザインについてはあまり気にしませんが、何ができるか、どのおもちゃで遊ばなければならないか、どのように機能するか、それらをどのように組み合わせるかについてはあまり気にしません。その感覚がつかめたら、デザインについて考えたいと思うようになり、TDD が本格的に動き出すのはそのときです。

そこからデザインパターンにつながるマイクロパターンを導入していきます

于 2008-09-26T03:42:00.533 に答える
3

TDDは、紹介されてからずっと楽しんでいます。コードの計画を立てるのに役立ちます。コードを変更するたびに、すべてのテストが「成功」で返されるので、今日は時間どおりに家に帰ることができます。

于 2008-11-26T23:34:49.480 に答える
3

私は似たようなことをしました。

  • ルール/ロジックを理解します。
  • 数学を理解します。
  • 次に、それをコーディングしてみてください。

それを数か月続けた後、それはただ内面化されます。分解しなければならない複雑な問題に直面するまで、自分がそうしていることに気づきません。

于 2008-09-26T02:17:43.093 に答える
3

私は上から始めて、下に向かって作業します。基本的に、私は高レベルの手順を書くことから始め、その中の詳細をスケッチし、詳細を埋め始めます。

私がこの問題を抱えていたとしましょう (プロジェクト euler から yoinked)

最初の 10 個の自然数の二乗和は、1^2 + 2^2 + ... + 10^2 = 385 です。

最初の 10 個の自然数の合計の 2 乗は、(1 + 2 + ... + 10)^2 = 55^2 = 3025 です。

したがって、最初の 10 個の自然数の二乗和と和の二乗和の差は 3025 385 = 2640 です。

最初の 100 個の自然数の 2 乗の和と和の 2 乗の差を求めます。

だから私はこのように始めます:

(display (- (sum-of-squares (list-to 10))
            (square-of-sums (list-to 10))))

さて、Scheme には、二乗和、二乗和、またはリストへの関数はありません。したがって、次のステップは、それらのそれぞれを構築することです。これらの各関数を構築する際に、さらに抽象化する必要があることに気付くかもしれません。各関数が実際に 1 つのことだけを行うように、物事をシンプルに保つようにしています。テスト可能な機能を構築するときは、単体テストを作成します。一部のデータの論理的なグループ化とそれらに作用する関数に気付き始めると、それをオブジェクトにプッシュすることがあります。

于 2008-09-26T03:40:08.150 に答える
2

プログラミングに関しては、私が知っているヒューリスティックは約12種類あると思います。そのため、私は時々、自分がやろうとしていることでリストを調べる傾向があります。最初に、望ましい最終結果が何であるかを知ってから、それを見つけるために逆方向に作業を試みることが重要です。

次のような方法のいくつかをカバーするAlgorithmsクラスを覚えています。

  • 既知の問題または些細な問題に減らします
  • 分割統治法(ここではMergeSortが典型的な例です)
  • 適切な関数を持つデータ構造を使用します(ここではHeapSortが例です)
  • 再帰(些細な解決策を知っていて、それらに減らすことができる)
  • 動的計画法

ソリューションを整理し、奇妙な状況でテストすることもあります。たとえば、Lを数値にすべきだと誰かが考えた場合、私は通常、アイデアを作成する前に擬似コードでテストするために使用します。

デザインパターンは、アダプターが必要な場合や、状態や戦略ソリューションに整理する場合など、特定の場合に使用できる便利なツールセットです。

于 2008-11-26T23:59:09.990 に答える
2

父は、最初にプログラミングについて教えてくれたときに、私に使わせてくれたフロー チャートのステンシルをたくさん持っていました。今日まで、問題を分析する方法の論理的なプロセスを構築するために、四角形とひし形を描いています。

于 2008-09-26T03:48:34.027 に答える
2

希望的観測は、おそらく複雑な問題を解決するための最も重要なツールです。疑問がある場合は、問題を解決する関数が存在すると仮定します (最初にスタブを作成します)。後で戻って展開します。

于 2008-09-26T02:21:20.820 に答える
2

プロセスを探している初心者向けの良い本: Test Driven Development: By Example

于 2008-09-26T03:04:54.820 に答える
1

はい..私が始めたとき、TDD は存在しませんでした (またはそれほど人気が​​ありませんでした)。問題の説明からコードへの移行は TDD でしょうか? ... それは少し高度ではありませんか? つまり、「将来の」開発者がプロ​​グラミング言語が何であるかをほとんど理解していない場合、それは非生産的ではないでしょうか?

アルゴリズムからコードへの移行を行う hamcrest はどうですか。

于 2008-09-26T03:16:09.347 に答える
1

あなたの問題を述べるより良い方法があると思います。

「システム」として定義する代わりに、ユーザーの入力と出力に関して期待されるものを定義します。

「ウィンドウでは、ユーザーがリストからアイテムを選択する必要があり、ボックスにはその価格が表示される必要があります。」

次に、サンプル アイテムや最終的なコストなど、コストを決定する要因のいくつかを彼に与えることができます。

(これも非常に TDD に似たアイデアです)

于 2009-09-26T02:01:30.080 に答える
-3

5% オフになってからさらに 5% オフしても、10% オフにはならないことに注意してください。むしろ、95% の 95%、つまり 90.25%、つまり 9.75% の割引を支払うことになります。したがって、パーセンテージを追加しないでください。

于 2008-09-26T02:59:57.547 に答える