ソフトウェア工学

システム開発ライフサイクル内で働く専門家、学者、学生向けのQ&A

5
典型的な「動的言語の間違い」を回避する方法は?
私は最近、膨大なユーザーベースから利益を得たいと思ったため、JavaScriptに数時間を費やしました。そうすることで、ほとんどの人が動的言語に起因するパターンに気付きました。物事は本当に迅速に機能しますが、コードが特定のサイズに達すると、一般的にタイプ、スペル、リファクタリングのエラーで多くの時間を無駄にします。コンパイラが通常私を免れるエラー。また、別のモジュールでタイプミスをしたばかりのときに、ロジックのエラーを探す必要はありません。 JavaScriptや他の動的に型付けされた言語に続く信じられないほどのことを考えると、私のアプローチに何か問題があると信じるようになりました。または、これはあなたが支払わなければならない価格ですか? もっと簡潔に言うと: 〜2000 LOCでJavaScript(またはその他の動的言語)プロジェクトにどのようにアプローチしますか? これらの間違いを防ぐためのツールはありますか?私はFacebookとJSHintによるフローを試みましたが、これは多少役立ちますが、タイプミスはキャッチしません。

8
範囲外の意味のある値の場合に例外をスローするか、自分で処理する必要がありますか?
緯度/経度座標を表す構造体を作成しました。値の範囲は、経度では-180〜180、緯度では90〜-90です。 その構造体のユーザーがその範囲外の値を私に与えた場合、2つのオプションがあります: 例外をスロー(引数が範囲外) 値を制約に変換します -185の座標には意味があるため(極座標なので+175に非常に簡単に変換できます)、受け入れて変換できます。 例外をスローして、彼のコードが持つべきではない値をユーザーに与えたことをユーザーに伝える方が良いでしょうか? 編集:緯度/経度と座標の違いも知っていますが、議論を簡単にするためにそれを単純化したかったのです。

5
クリーンアーキテクチャ:プレゼンターを含むユースケースまたはデータを返す?
クリーンアーキテクチャユースケースをさせインタラクタ応答/表示を処理するために(DIP以下、注入される)プレゼンタの実際の実装を呼び出すことを示唆しています。ただし、このアーキテクチャを実装し、インタラクターから出力データを返し、コントローラー(アダプター層内)がその処理方法を決定できるようにする人がいます。2番目のソリューションは、インタラクターへの入力ポートと出力ポートを明確に定義していないことに加えて、アプリケーションの責任をアプリケーション層から漏えいさせていますか? 入出力ポート Clean Architectureの定義、特にコントローラー、ユースケースインタラクター、プレゼンター間の関係を説明する小さなフロー図を考慮すると、「ユースケースの出力ポート」がどうあるべきかを正しく理解しているかどうかはわかりません。 六角形アーキテクチャのようなクリーンアーキテクチャは、プライマリポート(メソッド)とセカンダリポート(アダプタによって実装されるインターフェイス)を区別します。通信フローに従って、「ユースケース入力ポート」がプライマリポート(したがって、単なるメソッド)になり、「ユースケース出力ポート」が実装されるインターフェイスになります。実際のアダプターを取得するコンストラクター引数、インタラクターが使用できるようにします。 コード例 コード例を作成するために、これはコントローラーコードになります。 Presenter presenter = new Presenter(); Repository repository = new Repository(); UseCase useCase = new UseCase(presenter, repository); useCase->doSomething(); プレゼンターインターフェイス: // Use Case Output Port interface Presenter { public void present(Data data); } 最後に、インタラクター自体: class UseCase { private Repository repository; private Presenter presenter; public UseCase(Repository …

2
従来のREST APIの代わりにSignalR(websockets)を完全に使用しない唯一の理由はパフォーマンスですか?
私は以前SignalR、いくつかのプロジェクトでリアルタイムのメッセージング機能を実現していました。確実に機能するようで、使い方を学ぶのは非常に簡単です。 少なくとも私にとっての誘惑は、Web APIサービスの開発を放棄し、SignalRすべてに使用することです。 思いやりのある設計によってこれを達成できると思います。もしそうなら、必要なクライアントコードははるかに少なくなります。さらに重要なことは、分割されたインターフェースではなく、サービスへの単一のインターフェースがあることを意味し、最悪の場合、物事がいつレンダリングされるかなどを考えずにこれを接続できることを意味します。 だから、私は知りたい: パフォーマンス以外にすべてのWebサービスの代わりにSignalRを使用しない他の理由はありますか? SignalRのパフォーマンスは、そうするのが理にかなわないということに関して十分ですか? 馬鹿げたようなことをせずに、サーバー側のオブジェクトとサービスの定義をクライアント側のサービスアクセスコードに変換できることは、長い間私の夢でしたnode.js。たとえば、興味深いオブジェクトInterestingObjectとそのオブジェクトへのサービスを定義する場合、サービスへCRUDのInterestingObjectService標準のURLルートを定義できます-"/ {serviceName} / {methodName}"-しかし、アクセスするクライアントコードを記述する必要がありますサービス。オブジェクトは、サーバーとバックにクライアントから渡されようとしているので、する実際的な理由はありません持っているがクライアント側のコードでオブジェクトを明示的に定義します。また、CRUD操作を実行するルートを明示的に定義する必要はありません。このすべてを標準化する方法があるはずだと思うので、WinFormsまたはJavaを書いている場合と同じように、サービスへのアクセスがクライアントからサーバーへ、そして透過的に戻るという仮定の下でクライアントを書くことが可能ですアプレットまたはネイティブアプリ、またはあなたが持っているもの。 SignalRが従来のWebサービスの代わりに使用するのに十分であれば、これを実現するための実行可能な方法である可能性があります。SignalRには、既に説明したサービスのようにハブを機能させる機能が既に含まれているため、この機能すべてをすぐに反映できる共通ベース(CRUD)サービスを定義できます。そうすれば、ほとんどの場合、サービスへのアクセスを許可することができ、慣習によってアクセスできるものにアクセスするためにコードを書き直す煩わしさを省くことができます。 DOM。 私の編集を読んだ後、私はそれが少し無意味であるように感じるので、私が何を得ているかについて質問があるかどうか私に尋ねてください。基本的に、サービスへのアクセスは可能な限り透過的にする必要があります。

6
インタープリターはマシンコードを生成しますか?
コンパイラーとインタープリターのトピックを集中的に研究しています。基本的な理解が正しいかどうかを確認したいので、次のことを想定しましょう。 「Foobish」という言語があり、そのキーワードは <OUTPUT> 'TEXT', <Number_of_Repeats>; したがって、コンソールに10回印刷する場合は、次のように記述します。 OUTPUT 'Hello World', 10; こんにちはWorld.foobish-file。 次に、選択した言語(この場合はC#)でインタープリターを作成します。 using System; namespace FoobishInterpreter { internal class Program { private static void Main(string[] args) { analyseAndTokenize(Hello World.foobish-file)//Pseudocode int repeats = Token[1]; string outputString = Token[0]; for (var i = 0; i < repeats; i++) { Console.WriteLine(outputString); } } …

8
関数名で文を始めますか?[閉まっている]
大文字と小文字を区別するプログラミング言語に関連する何かを入力しているときに、関数名で文を開始することがあります。現在、英語の規則では、文の最初の単語は大文字にする必要があります。ただし、関数名は小文字です。最初の単語が関数名になるということを私が何と言っているのか疑問に思っているなら、この例を見てください: フレッドの実装が壊れています。freadは、読み取られたバイト数を返す必要があります。 私はfreadの2番目のインスタンスをItに変更できることを理解していますが、文を書き換える以外にこれを処理する最良の方法を知りたいです。関数名を大文字にする必要がありますか?「文を書き直して」という答えを聞きたいのは、関数名で文を開始すると、知らない英語の規則に違反する場合だけです。編集:これらの答えを本当にありがとう。問題に対する私の洞察が変わり、改善されました。私はこれから多くを学びました。私はこれらのシンプルだが良い解決策を考えていなかったことに非常に驚いています。 私は文を交互に変えるというスタンスは非常に難しかったと思いますが、これらの良い答えのために、文の全体的な変更が関数の後にカッコを追加するか、または関数名、および利用可能な場合は関数名の書式設定を使用します。
42 functions 

10
コードで100%CPUを使用しないのはなぜですか?[閉まっている]
Windows XP以降で実行されるC#.NET 4プログラムについて具体的に説明していますが、一般的な回答も受け入れられます。 すでに最適化された効率的なプログラムを想定します。ここでの問題は、ハードウェアのCPU使用率が高いことの影響と、実装を効率化するかどうかではなく、使用率の高いプログラムを制限して摩耗を減らすかどうかにかかっています。 今日の同僚は、「最新のCPUは安価であり、100%のCPUで急速に劣化する」ため、データロードプロセスで100%のCPU使用率を目指してはならないと提案しました。 これは本当ですか?もしそうなら、なぜですか?以前は、集中的な操作や長時間の操作には100%のCPU使用率が望ましいという印象を受けていましたが、どちらの方法でも対象に関する立派なソースを見つけることができませんでした。
42 c#  multithreading  cpu  usage 

3
10進数では表現できないが、2進数では表現できる数値はありますか?
C#基数10での正確な表現が必要な数値に使用されるdecimal型を持ちます。たとえば0.1、基数2(floatおよびなどdouble)で表現することはできず、これらの型の変数に格納されると常に近似値になります。 逆の事実も可能かどうか疑問に思っていました。10進数では表現できないが、2進数では表現できる数字がありますか(この場合float、decimalそれらを処理するためにaの代わりにa を使用します)。

9
インターフェースを将来使用するためのプログラミング
次のようなインターフェイスを設計した同僚が隣に座っています。 public interface IEventGetter { public List<FooType> getFooList(String fooName, Date start, Date end) throws Exception; .... } 問題は、現時点では、この「end」パラメーターをコードのどこにも使用していないことです。将来的に使用する必要があるため、そこにあるだけです。 現在、役に立たないインターフェースにパラメーターを入れるのは悪い考えだと彼に納得させようとしていますが、「終了」日付の使用をいつか実装すると、多くの作業が必要になると主張し続けます。その後、すべてのコードを適応させる必要があります。 さて、私の質問は、「尊敬される」コーディングの達人のようなトピックを扱っているソースはありますか?

6
アジャイルチームの主任開発者の役割は何ですか?
リード開発者以外のアジャイル開発チームでは、一般的に: 標準を設定します(コーディングなど) チームの新技術を研究する チームの技術的な方向性を設定します 問題について最終決定権を持っています システムのアーキテクチャを設計します ただし、アジャイルチームの動作は異なります。 アジャイルチームは、前もってではなく、新しいデザインに依存します アジャイルチームは、1人が設計を指示するのではなく、一緒に設計します アジャイルチームは、プロジェクトを提供するのに最適な独自の技術的方向を決定します これにより、アジャイルチームの主任開発者はどこに残りますか?アジャイルチームにリード開発者を置くことは可能ですか?アジャイルチームはリードに異なる責任を要求しますか?

2
モバイルアプリのデータ同期-複数のデバイス、複数のユーザー
初めてのモバイルアプリの構築を検討しています。アプリケーションのコア機能の1つは、複数のデバイス/ユーザーが同じデータにアクセスできることです。すべてのデバイス/ユーザーはCRUD権限を持ちます。 アーキテクチャには、すべてのデータが保存されている中央サーバーが必要だと思います。デバイスはAPIを使用してサーバーと対話し、データ操作(レコードの追加、レコードの編集、レコードの削除など)を実行します。 データの同期が問題になるシナリオを想像します。アプリケーションがインターネットに接続されていないときに機能する必要があるため、この中央サーバーと通信できないと想定します。そう: ユーザーAはオフラインで、レコード#100を編集しています ユーザーBはオフラインで、レコード#100を編集しています ユーザーCはオフラインで、レコード#100を削除します ユーザーCがオンラインになります(おそらく、レコード#100がサーバー上で削除されるはずです) ユーザーAとBはオンラインになりますが、編集したレコードはもう存在しません 上記に類似したあらゆる種類のシナリオが考えられます。 これは一般的にどのように処理されますか?私はMySQLを使用する予定ですが、そのような問題に適切でないのではないかと思っています。
42 database  mysql  data  mobile 

7
リードが示唆するように、このプロジェクトの設計を中止して、このプロジェクトの設計を開始するにはどうすればよいですか?[閉まっている]
私はジュニア開発者(経験3年以下)であり、仕事では新しいシステムを設計しています。私の主任開発者はプリンシパルアーキテクトになりますが、彼はシステムを自分で(並行して)設計しようと挑戦しました。 アイデアをブレインストーミングし、私がアーキテクチャの提案として見たものを提案するいくつかのイテレーションの過程で、私のリードは私がやっていることのほとんどが「設計」ではなく「設計」であるというフィードバックを私に与えました。 彼は、設​​計は実装の記述であるのに対し、アーキテクチャは実装に依存しないと説明しました。彼は、デザイナーの帽子を脱ぎ、建築家の帽子をかぶる必要があると言いました。彼は私にそうする方法について少しアドバイスをくれましたが、私もあなたに尋ねたいと思います: ソフトウェアデザイナーモードから抜け出し、アーキテクトのように考え始めるにはどうすればよいですか? ここに、私が思いついた「デザイン」の例をいくつか示しますが、それは私のリードではアーキテクチャに関連するとは見なされませんでした。 私たちのシステムからリソースをロードおよびアンロードするためのアルゴリズムを思いつきました。私のリードは、アルゴリズムは明確にアーキテクチャではないと述べました。 システムが発生させる一連のイベントと、それらを発生させる順序を考え出しましたが、これもアーキテクチャとしてそれを削減するようには見えませんでした。 私は細部に巻き込まれ、十分に後退していないようです。アーキテクチャレベルの何かを思いついたとしても、さまざまな実装を試し、詳細をいじってから一般化して抽象化することで、そこにたどり着くことがよくありました。これをリードに説明したとき、彼は間違ったアプローチを取っていると言いました。「ボトムアップ」ではなく「トップダウン」を考える必要がありました。 以下に、プロジェクトに関する具体的な詳細を示します。 設計しているプロジェクトはWebアプリケーションです。 およそ10〜10万行のコードを見積もっています。 私たちは新興企業です。当社のエンジニアリングチームは約3〜5人です。 私たちのアプリケーションと比較できる最も近いものは、軽量のCMSです。同様の複雑さを持ち、主にコンポーネントのロードとアンロード、レイアウト管理、プラグインスタイルのモジュールを扱います。 アプリケーションはajax-yです。ユーザーはクライアントを一度ダウンロードしてから、サーバーに必要なデータを要求します。 MVCパターンを使用します。 アプリケーションには認証があります。 古いブラウザのサポートについてはあまり心配していません(なんと!)ので、私たちは世の中にあり、今後出てくる最新かつ最高のものを活用したいと考えています。(HTML5、CSS3、WebGL?、Media Source Extensionsなど) ここではいくつかあるプロジェクトの目標は: アプリケーションはスケーリングする必要があります。近い将来、私たちのユーザーは数百から数千のオーダーになりますが、数万から数百万以上を計画しています。 アプリケーションがいつまでも続くことを願っています。これは一時的な解決策ではありません。(実際には、私たちはすでに一時的な解決策を持っています。私たちが設計しているのは、私たちが持っているものの長期的な置き換えです)。 機密性の高い個人情報との接触がある可能性があるため、アプリケーションは安全でなければなりません。 アプリケーションは安定している必要があります。(理想的には、Gmailのレベルで安定しますが、火星探査機の極端にある必要はありません。)

7
職場での学習に費やす時間はどれくらいですか?[閉まっている]
私は今まで約2年間ソフトウェア開発者として働いてきました。ソフトウェア開発のように急速に進化している分野では、新しいテクノロジーやフレームワークなどの学習に時間を費やす必要があることは明らかです。 仕事で問題を解決するために何かを学ぶ必要がある場合、仕事でそれを学ぶのに必要な時間を自由に費やすことができるといつも思っていました。しかし、私はさまざまな同僚とこのトピックについて議論してきましたが、明らかに2つの極端な範囲で非常に異なる意見を保持していました。 あなたの雇用主は、物を知っていることに対してあなたに支払います。あなたはこの仕事をするのに必要な専門分野の知識を持っていると雇われました、そして、あなたがより多くの知識を獲得する必要があるように分野が現れたら、それはあなたが暇なときにそうするのは当然です。 そして他の極端な存在 長期的に仕事の生産性を高めるものは何であれ、仕事に時間を費やす価値があります。それは雇用主が最終的に利益を得るからです。もちろん、これは新しいテクニックの学習にも当てはまりますが、たとえば、VIMを学習して高速化するなどにも適用されます。 しかし、2番目に極端な傾向がある男性と何かに時間を費やす時間を議論するときでさえ、「時々1時間は大丈夫」から「時間がかかる」まで、非常に異なる意見がありました。 あなたの職場は新しいスキルを学ぶことを奨励していますか?もしそうなら、どのプロセスがこれを奨励する必要がありますか?プログラマーとしての1日の間に、新しいことを学習するのにどれだけの時間を費やしますか(実動コードを書くのではなく)?

8
クラスの本当の責任は何ですか?
私は、OOPの名詞に基づいた動詞を使用することが合法かどうか疑問に思っています。 私はこの素晴らしい記事に出くわしましたが、それが主張する点にはまだ賛成しません。 この問題をもう少し説明するために、この記事では、たとえばFileWriterクラスが存在するべきではないと述べていますが、書き込みはアクションなので、クラスのメソッドである必要がありFileます。RubyプログラマーはFileWriterクラスの使用に反対する可能性が高い(RubyはメソッドFile.openにファイルへのアクセスを使用する)のに対し、Javaプログラマーはそうではないため、多くの場合言語に依存していることに気付くでしょう。 私個人の(そしてもちろん、非常に謙虚な)視点は、そうすることは単一責任の原則を破ることだということです。PHPでプログラミングしたとき(PHPは明らかにOOPに最適な言語だからです)、この種のフレームワークをよく使用します。 <?php // This is just an example that I just made on the fly, may contain errors class User extends Record { protected $name; public function __construct($name) { $this->name = $name; } } class UserDataHandler extends DataHandler /* knows the pdo object */ { public function …


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