タグ付けされた質問 「programming-practices」

プログラミングプラクティスは、ソフトウェアの開発で一般的に使用される、またはあまり使用されないプラクティスです。これには、アジャイル開発、かんばん、コーディングのショートカットなどが含まれます。

4
社内環境とソフトウェア開発環境[非公開]
閉まっている。この質問はトピック外です。現在、回答を受け付けていません。 この質問を改善したいですか? 質問を更新して、 Software Engineering Stack Exchangeのトピックになるようにします。 5年前に閉鎖されました。 業界では、ソフトウェア開発者が会社自身が使用するコードを書いている「社内開発」環境と、ソフトウェアが販売/配布されるように構築されている適切な「ソフトウェア開発」環境との間で区別があります。一般に。 とりわけ、両者の明らかな違いの1つは、ソフトウェア開発志向の企業は通常、仕様作成、テスト、構築などのソフトウェア開発ライフサイクルを順守するのに対し、社内志向のショップは通常、彼ら自身がエンドユーザーであり、正しく行われなかった何かを常に修正できるため、よりカジュアルな方法で物事を行います。 学生として(他のほとんどの学生と同じように)、ソフトウェア開発環境で仕事をすることを期待していましたが、社内のやり方で運営する会社で最初の地位を得ました。 時には、本格的なソフトウェア開発の経験を逃していないのではないかと思います。この気持ちの根拠はありますか?適切なソフトウェア開発環境に参加しようとする必要がありますか?

7
圧倒的なコードを管理可能なチャンクに分解する最良の方法は?
特定のレベルの複雑さに達すると、大規模なプロジェクトに絶えず圧倒されます。プロジェクトの特定のポイントに達すると、進行が遅くなり、絶えずステップをたどり、あらゆる種類の混乱を整理します。 私のこの弱さのために、リファクタリングが本当に上手になりました。そして、私は常にオブジェクトをより小さく管理しやすいものに分解しようとしています。この弱点のために、物事を適切に設計することにあまりにも注意を払うことになりました。 問題を小さな問題に分解できれば、スムーズに達成できると思います。頭に浮かぶ戦略の1つは、テスト駆動開発です。他に何ができますか?

5
アランクーパーの統合ファイルモデルはどうなりましたか?
長い間、アラン・クーパー(彼の著書「About Face」の3つのバージョンで)は、とりわけ、彼がこれまでに発明した最もばかげたメッセージボックスと呼ばれるものを省くために「統一ファイルモデル」を推進してきました。アプリまたはフォームの[閉じる]ボタンを押すと、「変更を破棄しますか?」というポップアップが表示されます。私はこのアイデアと彼の議論が好きですが、ほとんどのベテランのプログラマーとユーザーが持っている、それに対するひねくれた反応もあります。 Cooperの本は非常に人気があり尊敬されているように見えますが、この特定の問題に関するWeb上の議論はほとんどありません。「Programming Industrial Strength Windows」の作者であるPetter Hesselbergがそれについて言及していますが、それについては思われます。 私は現在取り組んでいる(デスクトップ)プロジェクトでこれを実装する機会がありますが、MS WordとExcelの方法を熟知している顧客や同僚からの抵抗に直面しています。私は彼らの異議を無効にする立場にありますが、そうすべきかどうかはわかりません。 私の質問は: これについて、私が見つけられなかった良い議論はありますか?アプリでこれをしている人はいますか?残念ながら、Microsoftがやるまで実装するのは実用的ではないというのは良い考えですか?

5
例外処理、ロギングをいつ書き始めるか
例外処理コードの記述をいつ開始しますか?いつログ文を書き始めますか。 この質問を詳しく説明するために、log4netロギングを備えた.NETプラットフォームを使用していると仮定しますが、一般的な方法で自由に回答してください。 解決策:Windowsフォームプロジェクト。プロジェクト:UI、BusinessRules、DataHandlers だから、作成、読み取り、更新、削除などのデータ操作を最初に行うDataHandlersを書くことに取り掛かりますか? 次に、ビジネスルールでフォローアップします そして、UIまたは上記の他の組み合わせ。 アプリケーションの機能をテストします。 そして、例外処理コードの作成を開始し、最後にロギングコードを作成しますか? 例外処理コードの記述を開始する適切なタイミングはいつですか? PS:本Clean Codeの中で、彼らは最初にtry-catch-finallyブロックを書くと言っています。それで、この質問をすることになりました。

8
C文字列は常にヌルで終了しますか、それともプラットフォームに依存しますか?
現在、私は組み込みシステムで作業しており、オペレーティングシステムなしでマイクロプロセッサに文字列を実装する方法を考えています。これまでのところ、私がやっていることは、NULLで終了する文字ポインタを持つという考えを使用し、NULLが終了を示す文字列として扱うことです。私はこれがかなり一般的であることを知っていますが、これが当てはまることを常に期待できますか? 私が尋ねる理由は、ある時点でリアルタイムオペレーティングシステムを使用することを考えていたため、現在のコードを可能な限り再利用したいからです。そこにあるさまざまな選択肢について、文字列が同じように機能することをほとんど期待できますか? 私の場合はもっと具体的にしましょう。私は、シリアルポート経由でコマンドを受け取って処理するシステムを実装しています。コマンド処理コードを同じにして、RTOS(コマンドを含む)で作成された文字列オブジェクトがすべてNULLで終了することを期待できますか?または、OSに基づいて異なりますか? 更新 この質問を見るようにアドバイスされた後、私はそれが私が尋ねていることを正確に答えていないことを決定しました。質問自体は、文字列の長さを常に渡す必要があるかどうかを尋ねています。これは私が尋ねているものとはまったく異なり、答えの一部には有用な情報が含まれていましたが、私が探しているものではありません。なぜか理由を与えるためにそこに見えた答えではないヌル文字で文字列を終了させます。私が尋ねているものとの違いは、異なるプラットフォームの生まれた文字列がnullで独自の文字列を終了することを多かれ少なかれ期待できるかどうか、それが理にかなっている場合は、すべてのプラットフォームを試してみる必要はありません。

6
デフォルト値-それらは良いですか、悪いですか?
一般的なデフォルト値に関する質問-デフォルトの戻り関数値、デフォルトのパラメーター値、欠落している場合のデフォルトのロジック、例外を処理するためのデフォルトのロジック、エッジ条件を処理するためのデフォルトのロジックなど 長い間、私はデフォルト値を「純粋な悪」なものだと考えていました。これは「大惨事を覆い隠し」、バグを見つけるのが非常に難しいものです。しかし最近、デフォルト値をある種の技術的負債として考えるようになりました...これはまっすぐに悪いことではありませんが、「短期資金」を提供してプロジェクトを生き残ることができます住宅ローンを出さずに家を買う?)。 私が「短期」と言うとき-私は意味しません-「最初に何かを迅速に行い、後でプロダクションにヒットする前にそれをリファクタリングします」。いいえ-実稼働ソフトウェアのハードコードされたデフォルト値に依存することについて話している。確かに-それはいくつかの問題を引き起こす可能性がありますが、それが一年で単一のトラブルを引き起こすだけならどうでしょう。 繰り返しますが、ここでは「平均的な」メインストリームソフトウェア(原子力発電所のソフトウェアではありません)について話しています。平均的なWebサイトまたは会計ソフトウェアのUIアプリケーションです。 。 繰り返しになりますが、私の経験から、ビジネスユーザーは完璧なソフトウェアを待つのではなく、「何らかの形で機能する」ソフトウェアを使いたいと考えています。また、RADスタイルのソフトウェアを開発する場合、デフォルト値の使用は非常に役立ちます。しかし、再び-私が費やした最長のデバッグセッションは、途中で「デフォルト」でなくなったデフォルト値によって導入されたバグ、または小さなサブシステムが最近アップグレードされたため、このアップグレードの結果ではありませんデフォルトを正しく処理します(たとえば、空のリストとnull、またはnullの文字列と空の文字列)。 だから私の質問は-デフォルト値は良いか悪いかです。そして、それらが技術的負債である場合-返済を支払う余裕があるように、どのくらい借りることができるかをどのように測定しますか? どんな入力でも本当に感謝します。 乾杯。 編集: 開発中にコーナーをカットする方法としてデフォルト値を使用している場合-コーナーのカットによりバグや問題が発生する場合-これらの問題から回復する方法は何ですか?

5
2つのサーバーに照会し、最速の応答のみを消費することは、どのような条件で(もしあれば)良い習慣ですか?
なぜjavascriptを使用するのかについて、コミュニティで削除された質問をSOに尋ねましたPromise.race。 何らかの値を計算する2つのサービスがある場合、それらを並行してクエリし、1つをクエリし、失敗を待ってから2番目をクエリするのではなく、最初に返される値を使用できます。 私は冗長性とこのユースケース全般についてグーグルで調べましたが、何も見つかりませんでしたし、POVから、応答を使用しない場合はサーバー/サービスにワークロードを追加することは決して良い考えではありません。


4
メソッドのパラメーターを再利用するのは悪い習慣ですか?
メソッド自体からメソッドに渡される値を変更する必要がある場合があります。例として、このメソッドのような文字列をサニタイズします: void SanitizeName(string Name) { Name = Name.ToUpper(); //now do something here with name } Name引数は参照渡しではないため、これはまったく無害です。ただし、何らかの理由で、将来開発者がすべての値をrefで渡すことにした場合、文字列のサニタイズはメソッドの外部の値に影響を及ぼし、有害な結果を招く可能性があります。 したがって、引数自体に再割り当てする代わりに、常に次のようなローカルコピーを作成します。 void SanitizeName(string Name) { var SanitizedName = Name.ToUpper(); //now do something here with name } これにより、値が渡される方法を変更してもメソッドの外での進行に影響を与えないことが保証されますが、これについて過度に妄想を立てているのではないかと思います。

2
Haskellが3n + 1問題を解決する方法
:ここではSPOJから、簡単なプログラミングの問題であるhttp://www.spoj.com/problems/PROBTRES/が。 基本的に、iとjの間の数値に対して最大のCollat​​zサイクルを出力するように求められます。(数$ n $のコラッツサイクルは、最終的に$ n $から1に到達するためのステップ数です。) 私は、JavaまたはC ++のパフォーマンスと比較してパフォーマンスを解決するHaskellの方法を探しています(許可された実行時間の制限に収まるように)。既に計算されたサイクルのサイクル長をメモする単純なJavaソリューションは機能しますが、Haskellソリューションを取得するためのアイデアの適用に成功していません。 Data.Function.Memoizeと、この投稿/programming/3208258/memoization-in-haskellのアイデアを使用して、自家製のログ時間メモ化手法を試しました。残念ながら、メモ化は実際にはcycle(n)の計算をさらに遅くします。減速はHaskellウェイのオーバーヘッドによるものだと思います。(解釈する代わりに、コンパイル済みのバイナリコードで実行してみました。) また、iからjへの単純な反復処理にはコストがかかる($ i、j \ le10 ^ 6 $)と思われます。そこで、http://blog.openendings.net/2013/10/range-trees-and-profiling-in-haskell.htmlからのアイデアを使用して、範囲クエリのすべてを事前計算しようとしました。ただし、これでも「Time Limit Exceeding」エラーが発生します。 このために、きちんとした競争力のあるHaskellプログラムに知らせるのを手伝ってもらえますか?

3
[]演算子の代わりにポインター演算を介して配列要素にアクセスすることは悪いことですか?
私はCでプログラミングすることを学び始めたばかりで、ポインターと配列の理解を深めるために、ポインターをまったく作成せずに配列の要素を参照しようとしました: for(k1 = 0; k1 < ROW; k1++){ for(k2 = 0; k2 < COLUMN; k2++){ array[k1][k2] = k1*COLUMN + k2 + 1; printf("[%d][%d] = %d\n", k1, k2, *(array[k1] + k2)); } } コード全体がコンパイルされ、問題なく実行されます。 大きなソースコード内のすべての単一配列に対してポインターを作成する必要があることは、非常に非効率的であると思われます。 したがって、ポインタを使用して配列のアドレスを保存および取得するのではなく、上記のように、配列のアドレスを直接使用するのは悪いプログラミング習慣ですか?

3
既知の問題をソフトウェアに直接入れることは適切ですか?
Androidアプリのメンテナンスを引き継ぎました。多少の問題は残っていますが、多少の修正はありますが、Android OSのバージョンが異なるためにまだ問題があります。 たとえば、MediaPlayerクラスを使用してWebリクエストを送信すると、リクエストが送信される前にOSによってカスタムHTTPヘッダーが取り除かれますが、Android 4.X(徹底的にテスト済み)のみであり、この特定の機能は依存するため失敗しますそれらのヘッダー。 これは既知の問題であり、回避しようとしていますが、次のような条件付きチェックを行うことをお勧めします if (OS.VERSION == 4) { knownIssueDialog(This feature will not work on your Android version... etc."); } 明らかに、サポートチャネルにこれを記載しますが、これらの既知の問題もソフトウェアに埋め込み、必要なときに必要に応じて提示することは(すべてを追跡することを前提とする)良いアイデアかどうか疑問に思っています。上記のようなものです。 このような種類の問題に基づいて、複数の悪いレビューと多くのサポートメールを受け取り続けるため、適切に機能しないことがわかっている機能をブロックするだけで、多くの時間と頭痛の種を節約できると思います。 2つの潜在的な問題があります。 ユーザーは、「既知の問題」ダイアログのようなものを見たことがないでしょう。多くのユーザーは、それが何を意味するのか理解していないかもしれません。 開発のオーバーヘッドが少しあります-これらの問題をコードのどこかに追跡する必要があります。幸いなことに、Javaアノテーションを使用すると、そのような条件付きチェックの前に、@KnownIssueまたはそれに類することができるため、それらの検索/変更が非常に簡単になります。 ソフトウェアに「既知の問題」プロンプトを入れるのは理にかなっていますか? 編集:これは、約1週間前に発生し始めた問題であることを追加します。私は問題を半分修正しましたが、問題を引き起こしているのはOSであるため、4.Xで修正できる可能性は非常に低いです。修正された新しいバージョンをリリースして、ユーザーベースの50%を再び幸せにし、他の50%(4.Xユーザー)に4.Xでも問題が続くことを警告し、アップグレード(または何か)。問題は、ソフトウェアでそれを行う(つまり、4.Xユーザーにダイアログを表示する)か、「修正が機能しませんでした!!!」というサポートメールを送信するだけかどうかです。その後、問題をさらに詳しく説明するサポートページに移動します。

8
ソフトウェアを書くのは、最初から読んで理解するよりも簡単ですか?[閉まっている]
現在のところ、この質問はQ&A形式には適していません。回答は事実、参考文献、または専門知識によってサポートされると予想されますが、この質問は議論、議論、世論調査、または広範な議論を求める可能性があります。この質問を改善し、場合によっては再開できると思われる場合は、ヘルプセンターをご覧ください。 6年前に閉鎖されました。 私と私の友人は、昨日、大規模なC ++ソフトウェアを書くことと、それを新規採用者として理解することとの違いについて話し合っていました。 ソフトウェアは一度に1行ずつ実行され、このプロセスは私たち(人間)が物事を学び、別の物の上に物事を構築する方法に似ているので、大きなソフトウェアを書くことは実際にそれを読んでそれが何をするかを理解するよりも簡単です(コードをステップスルーすると役立ちますが、複数のクラス/ソースファイルを一緒に覚えておく必要があります。それらが何のために書かれているのかさえ知らない、マルチスレッドコードは悪意のあるポイントを追加します)? これは最初は奇妙に聞こえますが、少し考えた後、合理的であるように見えました

4
ソロプロジェクトで機能のクリープを回避するにはどうすればよいですか?
だから私は2011年から2012年までずっと取り組んでいるプログラムを持っていますが、最後のリリースは2011年 12月でした。私は積極的に取り組んでいますが、機能クリープはそのい頭を誘い、今では未完成の機能に関する大量の情報で満たされています。 悪い点は、機能を実装するときに新しい機能が忍び寄るということです。将来、機能のクリープを回避して、1年以上で実際にリリースできるようにするにはどうすればよいですか。 このプロジェクトはiOSに基づいており、以前は各iOSバージョンの更新に関するリリースがありましたが、最後のリリースは5.1(2011)で戻ってきました。安定したリリースサイクルを取り戻せるようにしたいのですが、難しすぎることがわかりました。

7
「時間の終わり」の定数はありますか?
一部のシステムでは、時間値9999-12-31が、コンピューターが計算できる時間の終わりとして「時間の終わり」として使用されます。しかし、それが変化したらどうなるでしょうか?今回は組み込み変数として定義する方が良いと思いませんか? Cおよびその他のプログラミング言語では、通常MAX_INT、整数が持つことのできる最大値を取得するための変数などがあります。MAX_TIME多くのシステムで通常9999-12-31である「時間の終わり」に変数を設定するために、同様の機能がないのはなぜですか。間違った年(9999)にハードコーディングする問題を回避するために、これらのシステムは「時間の終わり」に変数を導入できますか? **実際の例** End of validity date: 31/12/9999.(公式文書はこのようにリストされています)ブロガーは、常に一番上にあるページ、ウェルカムページを書きたいと考えています。したがって、可能な限り将来の日付が与えられます。 3000?はい、あなたが直面しているウェルカムページは3000年1月1日に投稿されています。したがって、このページは永久にブログの上部に保持されます=)実際には2007年8月31日に投稿されています。

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