2017-12-11 8 views
-1

私はステップバイステップで処理する必要のあるコードを作成したいと思います。 手続き型プログラミングを考えてコードするのは簡単です。 しかし、OOPを使ってコードを作成するのは簡単ではありません。C++シーケンシャルロジックに適したデザイン

class AutoCoder 
{ 
public: 
    CommitCode(); 

private: 
    DownloadSourceCode(); 
    DecideHowToModify(); 
    WriteTestCode(); 
    DoModify(); 
    PerformmTest(); 
    RefineCode(); 
    Upload(); 
} 

にとっての問題は、方法は、順次に呼び出される必要があることであり、また、各ステップが失敗したとき 壊れるべきです。この良く、Iしかし、このような

DownloadSourceCode() 
.DeicdeHowToModify() 
.WriteTestCode() 
.... 

それとも

DownloadSourceCode() 
{ 
    ... 
    return DecideHowToModify(); 
} 

DecideHowToModify() 
{ 
    ... 
    return WriteTestCode(); 
} 

を作るために

bool AutoCoder::CommitCode() 
{ 
    if (false == DownloadSourceCode()) 
    { 
     return false; 
    } 

    if (false == DecideHowToModify()) 
    { 
     return false; 
    } 

    if (false == WriteTestCode()) 
    { 
     return false; 
    } 
    //...so on 
} 

にしかし、これらは別の使用のためのデザインパターンの不適切な使用やコード作るコードごみですユーザーが正しく使用することを制限することはできません。

もっと洗練されたコードを表示して、それがより良い理由を教えてくれる人はいますか?それではそのようにそれを行うこの良く、Iしかし、このような

DownloadSourceCode() 
.DeicdeHowToModify() 
.WriteTestCode() 

を作るために

+0

オリジナルの方法は何ですか?あらゆるステップで何がやっているのかははっきりしています。 – Steve

+0

実際のコードを入力してください。あなたの 'CommitCode()'が戻り値の型を欠いているだけでなく、パラメータも取らないので、ここであなたが解決しようとしている問題は完全にはっきりしません。 – user463035818

+2

古代神話とは対照的に、OOP自体は聖杯ではありません。あなたが問題があり、それが手続き的アプローチによって解決されたほうが良いと思うなら、それには何も問題はないでしょう(おそらくあなたはOOPの天国に達することはありませんが、誰が気にしますか?) – user463035818

答えて

0

。なぜそれをする許可を求める必要がありますか?それらの関数のそれぞれに適切な型のオブジェクトへの参照を返させる。前の手順が失敗したことを保証するオブジェクトを状態にするか、何もしないオブジェクトを返すかのいずれかを行います。

または

DownloadSourceCode() 
{ 
    ... 
    return DecideHowToModify(); 
} 

DecideHowToModify() 
{ 
    ... 
    return WriteTestCode(); 
} 

私はこの1つを避けるだろう - テスト/デバッグすることはほとんど不可能になるだろう。

0

あなたは、単に&&を使用することがあります。

bool AutoCoder::CommitCode() 
{ 
    return DownloadSourceCode() 
     && DecideHowToModify() 
     && WriteTestCode() 
     // && and so on ... 
    ; 
} 

例外は、別の代替です。

1

私はこのような場合に例外を使用しました。しかし、これを行う前に、C++ exceptions are badとそのC++ exceptions are goodを覚えておいてください。

bool AutoCoder::CommitCode() 
{ 
    try 
    { 
     DownloadSourceCode(); 
     DecideHowToModify(); 
     WriteTestCode(); 
     DoModify(); 
     PerformmTest(); 
     RefineCode(); 
     Upload(); 
    } 
    catch(std::exception& ex) 
    { 
     // Handle error 
     return false; 
    } 
    // Additional exceptions can be caught if you need to differentiate between 
    // different failure cases 

    return true; 
} 
+0

ありがとうございます。あなたがコメントした投稿は私にとって非常に有益です。残念ながら、私が関与したプロジェクトは例外を許可していません。 – kayjay

関連する問題