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

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

6
プログレッシブエンハンスメントとシングルページアプリ
ボストンで開催されたAn Event Apartというカンファレンスから戻ってきました。 スピーカーの間で本当に人気のあるテーマは、プログレッシブエンハンスメントのアイデアでした。サイトのコンテンツはHTMLに入れ、JavaScriptは動作を強化するためだけに使用する必要があります。 スピーカーがプログレッシブエンハンスメントに対して行った議論は非常に説得力がありました。古いブラウザや低帯域幅のネットワーク上のデバイスをサポートするための堅実なパターンであるだけでなく、HTMLはJavaScriptよりもはるかに優雅に失敗します(つまり、サポートされていないマークアップは無視されますが、ブラウザが実行中に例外をスローした場合スクリプト-あなたはうんざりしています)。 ジェレミー・キースはこれについて特に洞察力に富んだ講演を行いました。 しかし、BackboneやAngularなどの単一ページのWebアプリはどうでしょうか。これらのフレームワークの背後にある設計全体が、開発者をコンテンツをHTMLからJSON APIのようなものに移行させるように思われます。 プログレッシブエンハンスメントとシングルページWebアプリの2つのデザインパターンを融合させることはできません。一方が他方より優れている場合はありますか?それとも、敵対的な技術でさえないのか、ここに私の精神モデルで何かが欠けていますか?

5
動的に型付けされた言語で列挙型が必要なのはなぜですか?
ここでいくつかのコードを読んでいて、enumがhtmlタグの名前を保存するために使用されているのを見ました。なぜこれを行う必要があるのでしょうか?この戦略を使用するとどのようなメリットがありますか? コンパイルされた言語または静的に型付けされた言語で列挙型がどのように役立つかは知っていますが、動的に型付けされた言語で列挙型を見ると、上記のコード例のように興味があります。それで、質問は基本的に、動的に型付けされた言語で列挙型が必要なのか、それともまったく必要なのか、ということです。

5
悪い習慣-ケースを切り替えて環境を設定する
私が開発者として働いてきたこの3年間で、ユーザーがswitchステートメントを使用してURLのパス(バックエンドとフロントエンドの両方)を設定する多くの例を見てきました。以下に例を示します。 バックエンドの例(C#): public static string getHost(EnvironmentEnum environment){ var path = String.Empty; switch (environment) { case EnvironmentEnum.dev: path = "http://localhost:55793/"; break; case EnvironmentEnum.uat: path = "http://dev.yourpath.com/"; break; case EnvironmentEnum.production: path = "http://yourpath.com/"; break; } return path; } フロントエンドの例(JavaScript): (function () { if (window.location.host.indexOf("localhost") !== -1) { window.serviceUrl = "http://localhost:57939/"; } else …

5
なぜn層開発のコードベースは、今ではJavaScriptコードの量が同じかそれ以上ではないのですか?
私は長い間Webプログラミングを行ってきましたが、どこかで、今日の仕事をしている理由を追跡できませんでした(または、どうしてこのように物事をするようになったのですか)。 私は基本的なASP Web開発から始めましたが、非常に早い段階で、ページ上でディスプレイとビジネスロジックが混在していました。クライアント側の開発は大きく異なり(VBScript、さまざまなJavaScriptの種類)、サーバー側の検証について多くの警告がありました(したがって、クライアント側のロジックからは遠ざかりました)。 その後、しばらくの間ColdFusionに移りました。ColdFusionはおそらく、タグを使用して表示ロジックとビジネスロジックを分離した最初のWeb開発フレームワークでした。私には非常にはっきりしているように見えましたが、非常に冗長であり、ColdFusionは市場の需要が高くなかったため、先に進みました。 その後、ASP.NETバンドワゴンに飛び乗り、MVCアプローチを使用し始めました。また、Javaはエンタープライズシステムの象牙の塔の言語であるように思われ、MVCアプローチも試しました。その後、ASP.NETはこのMVVM設計パターンを開発し、Java(正確にはJ2EEまたはJEE)も苦労し、MVC2アプローチを採用しました。 しかし、今日、私が発見したのは、バックエンドプログラミングではなく、興奮と進歩がそこにあるということです。また、サーバー側ベースのMVCプラクティスは時代遅れのようです(人々はもうJSTLを実際に使用していますか?)。今日、私が取り組んでいるほとんどのプロジェクトで、JavaScriptフレームワークとクライアント側の開発は、すべてのエキサイティングで革新的な進歩が行われている場所であることがわかりました。 サーバーからクライアント側の開発へのこの移行が行われたのはなぜですか?JEEプロジェクトの1つの単純な行カウントを行いましたが、JavaScriptにはJavaよりも多くのコード行があります(サードパーティライブラリを除く)。JavaやC#などのプログラミング言語を使用したほとんどのバックエンド開発は、単にRESTのようなインターフェイスを作成することであり、表示、視覚化、データ入出力、ユーザーインタラクションなどのすべての苦労が対処されていることがわかりますAngular、Backbone、Ember、Knockoutなどのクライアント側フレームワーク経由 jQueryの前の時代に、n層開発のMVCのM、V、Cの間に明確な概念線があった多くの図を見ました。jQuery後、これらの線はどこに描かれますか?MVCとMVVMは、クライアント側のJavaScriptコードにすべて揃っているようです。 私が知りたいのは、なぜそのような移行をしたのですか(サーバー側プログラミングの強調からクライアント側へ、コンパイル言語の優先からスクリプト言語へ、命令型プログラミングから関数型プログラミングへ、これらはすべて同時に発生したようです) )そして、この移行/シフトはどのような問題を解決しましたか?

9
while(true)and loop-breaking-アンチパターン?
次のコードを検討してください。 public void doSomething(int input) { while(true) { TransformInSomeWay(input); if(ProcessingComplete(input)) break; DoSomethingElseTo(input); } } このプロセスには、有限であるが入力依存のステップ数が含まれると仮定します。ループは、アルゴリズムの結果としてそれ自体で終了するように設計されており、無期限に実行するように設計されていません(外部イベントによってキャンセルされるまで)。ループを終了するかどうかを確認するテストは、論理的な一連のステップの途中で行われるため、現在、whileループ自体は意味のあるものをチェックしません。代わりに、チェックは概念アルゴリズム内の「適切な」場所で実行されます。 終了条件がループ構造によってチェックされないため、バグが発生しやすいため、これは悪いコードだと言われました。ループを終了する方法を理解することはより困難であり、将来の変更を考慮して誤ってブレーク条件がバイパスまたは省略される可能性があるため、バグを招く可能性があります。 これで、コードは次のように構成できます。 public void doSomething(int input) { TransformInSomeWay(input); while(!ProcessingComplete(input)) { DoSomethingElseTo(input); TransformInSomeWay(input); } } ただし、これはコード内のメソッドの呼び出しを複製し、DRYに違反します。TransformInSomeWay後で他のメソッドに置き換えられた場合、両方の呼び出しを見つけて変更する必要があります(2つの呼び出しがあるという事実は、より複雑なコードではあまり明らかではありません)。 次のように書くこともできます。 public void doSomething(int input) { var complete = false; while(!complete) { TransformInSomeWay(input); complete = ProcessingComplete(input); if(!complete) { DoSomethingElseTo(input); } …

11
typedefsおよび#defines
私たちは皆、間違いなくtypedefsと#definesを使用しました。今日、彼らと仕事をしている間、私は物事について熟考し始めました。 int別の名前のデータ型を使用するには、以下の2つの状況を考慮してください。 typedef int MYINTEGER そして #define MYINTEGER int 上記の状況のように、多くの状況で、#defineを使用して非常にうまく処理でき、typedefを使用して同じことを実行できますが、同じことを行う方法はまったく異なる場合があります。#defineは、typedefではできないMACROアクションも実行できます。 それらを使用する基本的な理由は異なりますが、動作はどの程度異なりますか?両方を使用できる場合に、一方が他方よりも優先される場合 また、一方の状況では、他方よりも高速であることが保証されていますか?(たとえば、#defineはプリプロセッサディレクティブであるため、すべてがコンパイルまたは実行時よりも早く実行されます)。

15
極度の不安を感じることなく、本番の展開を自動化するにはどうすればよいですか?
当店では、ソース管理にSVNを、CIにCruiseControlを使用して、開発、テスト、および統合環境への自動ビルドと展開を処理しています。 これはすべてスムーズに機能しますが、ハードウェアとリソースの制約により、統合環境は運用環境のような2サーバーの負荷分散環境ではありません。それ以外はすべて同じですが、それが統合環境と実稼働環境の唯一の違いです(ただし、大きな環境です!) 理論的には、違いはアプリサーバーのわずかに異なる構成であり、デプロイスクリプトはビルドアーティファクトを1つだけではなく2つのサーバーにドロップするだけでよいのですが、なぜ本番デプロイを自動化するのにそんなに緊張するのでしょうか?! 私は一般的にコントロールマニアではありませんが、手作業でプロダクションにプロダクションを展開する必要性を常に感じています。私はこれが一般的に本当に悪いこと™であると同僚から聞いたが、彼らはそれに対して主張をすることに失敗した。 手動で行うと、正しいファイルを物理的にコピーしていること、アプリサーバーを物理的にシャットダウンし、正常に終了したことを確認できます。正常に起動し、展開が成功したことを確認してください。それは私に心の安らぎを与えます。 自動スクリプト化された運用展開のこのOR引数に対する引数は何ですか?


6
到達不能なコードで新しいRuntimeExceptionをスローするのは悪いスタイルですか?
少し前に、より熟練した開発者によって書かれたアプリケーションを保守することになりました。私はこのコードに出会いました: public Configuration retrieveUserMailConfiguration(Long id) throws MailException { try { return translate(mailManagementService.retrieveUserMailConfiguration(id)); } catch (Exception e) { rethrow(e); } throw new RuntimeException("cannot reach here"); } 投げることRuntimeException("cannot reach here")が正当化されるかどうか興味があります。私はおそらく、このコードがより経験豊かな同僚から来ていることを知っている明らかな何かを見逃しています。 編集:ここにいくつかの答えが言及したボディを再スローします。この質問では重要ではないと判断しました。 private void rethrow(Exception e) throws MailException { if (e instanceof InvalidDataException) { InvalidDataException ex = (InvalidDataException) e; rethrow(ex); } if (e …

11
一人のプログラマーのためのスクラム?[閉まっている]
私は非常に小さな会社で「Windowsエキスパート」と呼ばれています。この会社は、私、セールスおよびトレーニングの役割を担う機械エンジニア、および設計、開発、サポートの役割を担う社長から構成されています。 私の役割も同様に一般的ですが、主に、現在のWindowsのバージョンで製品を実行するために必要な、製品のプログラミングを設計および実装します。 ウェブキャストで提供されたスクラムパラダイムの高レベルの概要を見終えました。私の質問は、「製品の国際化とローカライズ」など、開発作業項目が通常非常に高いレベルで与えられることを考えると、製品開発へのこのアプローチについてもっと学ぶ価値があるかどうかです。 もしそうなら、スクラムを一人のプログラマーの使用に適応させることをどのように提案しますか?そのためには、クラウドベースのツールやその他のツールが有用でしょうか? そうでない場合、一人のプログラマーが日々努力を整理するためにどのようなアプローチを提案しますか?(おそらく、質問はその単純な質問に還元されます。)

10
通常、オブジェクトまたはそのメンバー変数を関数に送信しますか?
これらの2つのケースの間で一般的に受け入れられている方法は次のとおりです。 function insertIntoDatabase(Account account, Otherthing thing) { database.insertMethod(account.getId(), thing.getId(), thing.getSomeValue()); } または function insertIntoDatabase(long accountId, long thingId, double someValue) { database.insertMethod(accountId, thingId, someValue); } 言い換えれば、一般的にオブジェクト全体を渡すか、必要なフィールドだけを渡す方が良いでしょうか?

4
コミットにバージョンタグを付けないのはいつですか?
コンテキスト:最近、セマンティックバージョニングについて知り、自分のプロジェクトで実際にそれを最適に使用する方法を決定しようとしています。 semverがバージョニングのために大きな変更、小さな変更、およびパッチを考慮に入れていることを考えると、いつコミットに更新されたバージョンのタグを付けるべきではないでしょうか?すべての変更がこれらのカテゴリのいずれかに収まるように思えるので、すべての変更をバージョン管理する必要がありますが、GitHubで人気のあるさまざまなプロジェクトを見ると、これは物事が行われる方法ではないようです(大規模なプロジェクトには数万件のコミットがあり、タグは数百件しかありません)。

6
他の1つの関数でのみ使用される関数をその関数内に配置する必要がありますか?
具体的には、JavaScriptで記述しています。 私の主な機能が機能Aであるとしましょう。機能Aが機能Bを複数回呼び出し、機能Bが他のどこでも使用されていない場合、機能A内に機能Bを配置するだけですか? それは良い習慣ですか?または、関数Bを関数Aと同じスコープに配置する必要がありますか?

4
バグを再現するためのハードウェアのセットアップが入手困難または不可能な場合に、新しいコードを効率的にトラブルシューティングまたはテストする方法は?
私は中規模の会社(従業員150人、エンジニアリングチーム10人まで)で働いており、私のプロジェクトのほとんどは、半自動化されたテストアプリケーションを目的として、実験装置(オシロスコープ、光スペクトラムアナライザーなど)とのインターフェイスを含んでいます。ハードウェアのセットアップが利用できなくなった、または利用できなかったために、新しいコードを効率的にトラブルシューティングまたはテストできないいくつかの異なるシナリオに遭遇しました。 例1:ベンチトップタイプのセンサーを使用して10〜20の「バーンイン」プロセスを個別に実行するセットアップ-テスト用にこのようなセンサーを1つ取得でき、ときどきインターフェイスのすべての面をシミュレートするために1つを盗むことができました複数のデバイス(検索、接続、ストリーミングなど)。 最終的にはバグが発生し(最終的にはデバイスファームウェアとドライバーに存在する)、1つのユニットだけで正確に再現するのは非常に困難でしたが、これらのデバイスを10〜20個同時に使用すると「ショーストッパー」レベルに近づきました。これはまだ解決されておらず、継続中です。 例2:コアコンポーネントとして高価な光スペクトルアナライザーを必要とするテスト。このデバイスはかなり古いものであり、大企業に買収されて基本的に解体されたメーカーによると、その唯一のドキュメントは翻訳が不十分であると思われる長巻の(そして情報価値のない)ドキュメントでした。最初の開発中、私はデバイスを自分の机に置いておくことができましたが、物理的にもスケジュールどおりにも、24時間年中無休の複数週間のテスト中に縛られました。 デバイスに関連する、または関連しないバグが表示される場合、アプリケーションの外部でコードをテストして適合させるか、コードを盲目的に書いて実行と実行の間にあるテスト時間で絞り込もうとする問題をしばしば経験する必要があります。プログラムロジックでは、OSAと残りのテストハードウェアが適切に配置されている必要があります。 私の質問は、これにどのようにアプローチする必要があるのでしょうか?デバイスシミュレーターの開発に時間を費やす可能性がありますが、それを開発の見積もりに組み込むと、ほとんどの人が期待する以上に膨れ上がります。すべての問題を正確に再現できるとは限りません。また、ここで同じ機器を2回使用することはほとんどありません。ユニットテストなどで上達することができます...私はまた、問題について大声で話し、一時的な遅延が必要であることを他の人に理解させることができます。これは、研究開発の頭痛だけでなく、通常は冗談として認識されます製造業に売り込まれたとき。

5
(たとえば、bool / intの代わりに)voidを使用する必要がある場合と理由
開発者が関数にとって重要ではない何かを返すことを選択したメソッドに時々出くわします。つまり、コードを見ると、どうやら同じように機能しているように見えvoid、少し考えてから「なぜ?」これはおなじみですか? 時には、単にaを実行するのではなく、boolまたはのようなものを返す方が良い場合が多いことに同意します。しかし、全体像では、賛否両論についてはわかりません。intvoid 状況によっては、an intを返すことにより、呼び出し側はメソッドの影響を受ける行またはオブジェクトの量を知ることができます(たとえば、5つのレコードがMSSQLに保存されます)。「InsertSomething」のようなメソッドがブール値を返すtrue場合、成功した場合、そうでない場合に返すように設計されたメソッドを持つことができますfalse。発信者は、その情報に基づいて行動するかどうかを選択できます。 一方、 メソッド呼び出しのあまり明確でない目的につながる可能性がありますか?悪いコーディングはしばしばメソッドの内容を再確認せざるを得ません。何かを返す場合、メソッドは返された結果で何かをしなければならない型であることを知らせます。 もう1つの問題は、メソッドの実装が不明な場合、開発者は機能的に重要ではないものを返すことにしたのですか?もちろんコメントできます。 メソッドの閉じ括弧で処理を終了できる場合、戻り値を処理する必要があります。 ボンネットの下で何が起こりますか?falseスローされたエラーのために、呼び出されたメソッドは取得されましたか?または、評価結果のためにfalseを返しましたか? これについてのあなたの経験は何ですか?これにどのように対応しますか?

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