ソフトウェア工学

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

12
エラーをスローすべきかどうかを示すフラグを持っている
私は最近、かなり古い開発者(50歳以上)がいる場所で働き始めました。彼らは、システムがダウンすることができなかった航空を扱う重要なアプリケーションに取り組んできました。その結果、古いプログラマーはこの方法でコーディングする傾向があります。 彼は、オブジェクトにブール値を入れて、例外をスローすべきかどうかを示す傾向があります。 例 public class AreaCalculator { AreaCalculator(bool shouldThrowExceptions) { ... } CalculateArea(int x, int y) { if(x < 0 || y < 0) { if(shouldThrowExceptions) throwException; else return 0; } } } (このプロジェクトでは、その時点では存在できないネットワークデバイスを使用しようとしているため、メソッドは失敗する可能性があります。エリアの例は、例外フラグの例にすぎません) 私にはこれはコードの匂いのようです。毎回例外フラグをテストする必要があるため、単体テストの作成は少し複雑になります。また、何か問題が発生した場合、すぐに知りたいと思いませんか?続行方法を決定するのは呼び出し側の責任ではないでしょうか? 彼の論理/推論は、プログラムがユーザーにデータを表示するという1つのことをする必要があるということです。それを妨げないその他の例外は無視する必要があります。私はそれらが無視されるべきではないことに同意しますが、バブルアップして適切な人によって処理されるべきであり、そのためのフラグを処理する必要はありません。 これは例外を処理する良い方法ですか? 編集:設計上の決定についてより多くのコンテキストを与えるために、このコンポーネントが失敗した場合でも、プログラムは引き続き動作し、メインタスクを実行できるためだと思います。したがって、例外をスローしたくない(そして、それを処理しない?)ので、ユーザーが正常に動作しているときにプログラムを停止させます 編集2:より多くのコンテキストを与えるために、この場合、メソッドはネットワークカードをリセットするために呼び出されます。ネットワークカードが切断および再接続され、異なるIPアドレスが割り当てられると問題が発生します。したがって、古いIPでハードウェアをリセットしようとするため、リセットは例外をスローします。

5
負のゼロが重要なのはなぜですか?
正と負のゼロの異なる表現を気にする理由について私は混乱しています。 複素数を含むプログラミングでは、負のゼロ表現を持つことが非常に重要であるという主張を漠然と思い出しました。複素数を含むコードを書く機会がなかったので、なぜそうなるのか少し困惑しています。 この概念に関するウィキペディアの記事は特に有用ではありません。私が正しく理解すれば、符号付きゼロについて漠然とした主張をするだけで、浮動小数点での特定の数学的操作が簡単になります。この回答には、動作が異なる2つの関数がリストされています。これらの関数の使用方法に精通している場合は、例から何かを推測できます。(ただし、複雑な平方根の特定の例は完全に間違っているように見えます、2つの数字は数学的に同等なので、誤解がない限り)。しかし、それがないとあなたが直面するようなトラブルの明確な説明を見つけることができません。私が見つけたより数学的なリソースは、数学的な観点からこの2つを区別することができないという状態を見つけることができました。 では、なぜ負のゼロはコンピューティングで価値があるのでしょうか?私は何かを逃していると確信しています。

11
パスカバレッジはすべてのバグの発見を保証しますか?
プログラムを通るすべてのパスがテストされる場合、それはすべてのバグを見つけることを保証しますか? そうでない場合は、なぜですか?プログラムフローのあらゆる可能な組み合わせを通過し、問題が存在する場合はそれを見つけられないのはどうしてですか。 「すべてのバグ」が見つかる可能性があることをお勧めしますが、おそらくパスカバレッジが実用的ではないため(組み合わせであるため)、これまで経験したことがないためでしょうか。 注:この記事では、私が考えているカバレッジタイプの概要を簡単に説明します。

2
なぜ多くのハッシュされ暗号化された文字列が等号で終わるのですか?
私はC#とMSSQLを使用していますが、ご想像のとおり、パスワードはソルトおよびハッシュされて保存されています。 nvarchar列に格納されているハッシュを見ると(たとえば、すぐに使用できるaspnetメンバーシッププロバイダー)。生成されたSaltとHashの値が常に1つまたは2つの等号で終わるように見えるのは、常に興味がありました。 暗号化アルゴリズムを使用しているときに似たようなものを見てきましたが、これは偶然ですか、それとも理由がありますか?

5
別のマイクロサービスによって「所有」されているデータベースからデータを読み取ることがなぜそれほど悪いのか
最近、マイクロサービスアーキテクチャに関する次の優れた記事を読みました。http://www.infoq.com/articles/microservices-intro AmazonにWebページをロードすると、100以上のマイクロサービスが協力してそのページを提供することが記載されています。 その記事では、マイクロサービス間のすべての通信はAPIを介してのみ行うことができると説明しています。私の質問は、すべてのデータベースの書き込みはAPIを介してのみ可能であると言うのがなぜ悪いのかということですが、さまざまなマイクロサービスのデータベースから直接読み取ることができます。たとえば、マイクロサービスの外部からアクセスできるデータベースビューはごくわずかであるため、マイクロサービスを管理するチームは、これらのビューをそのまま保持している限り、マイクロサービスのデータベース構造を変更できることを知ることができます。欲しいです。 ここに何かが足りませんか?API経由でのみデータを読み取る必要がある他の理由はありますか? 言うまでもなく、私の会社はAmazonよりもずっと小さく(常にそうです)、私たちが持つことのできるユーザーの最大数は約500万人です。

1
Gerritコードレビュー、またはGithubのフォークアンドプルモデル?
チームとコミュニティで開発されるソフトウェアプロジェクトを開始しています。以前はgerritで販売されていましたが、今ではGithubのフォークおよびプルリクエストモデルは、より多くのツール、コミットを視覚化する方法、および使いやすさをほぼ提供しているようです。 両方について少なくとも少し経験がある人にとって、それぞれの長所と短所は何ですか?コミュニティ開発の可能性を残したいチームベースのプロジェクトにはどちらが良いでしょうか?
64 git  github  forking  gerrit 

1
Rust TraitsはGoインターフェイスとどう違うのですか?
私はGoに比較的精通しており、小さなプログラムをいくつか書いています。錆は、もちろん、あまり馴染みがありませんが、注視しています。 最近http://yager.io/programming/go.htmlを読んで、Genericsが処理される2つの方法を個人的に調べたいと思いました。エレガントに達成できませんでした。私は、Rustの特徴がいかに強力であるかについての誇大宣伝を聞き続けました。Goでいくつかの経験を積んで、それがどのように真実であり、最終的にどのような違いがあったのかと思いました。私が見つけたのは、特性とインターフェースがかなり似ているということです!最終的に、私は何かが欠けているかどうかわからないので、ここでそれらの類似点の簡単な教育的要約があります。 それでは、ドキュメントからGoインターフェイスを見てみましょう。 Goのインターフェイスは、オブジェクトの動作を指定する方法を提供します。これができる場合は、ここで使用できます。 最も一般的なインターフェイスはStringer、オブジェクトを表す文字列を返すことです。 type Stringer interface { String() string } そのため、そのString()上で定義されているStringerオブジェクトはすべてオブジェクトです。これfunc (s Stringer) print()は、ほとんどすべてのオブジェクトを取得して印刷するようなタイプシグネチャで使用できます。 またinterface{}、いずれのオブジェクトも受け取ります。その後、実行時にリフレクションを介してタイプを決定する必要があります。 それでは、ドキュメントからRust Traitsを見てみましょう: 最も単純な場合、特性はゼロ個以上のメソッドシグネチャのセットです。たとえば、単一のメソッドシグネチャを使用して、コンソールに出力できるものに対して特性Printableを宣言できます。 trait Printable { fn print(&self); } これは、すぐにGoインターフェースに非常によく似ています。私が見る唯一の違いは、単にメソッドを定義するのではなく、特性の「実装」を定義することです。だから、私たちはやる impl Printable for int { fn print(&self) { println!("{}", *self) } } の代わりに fn print(a: int) { ... } ボーナス質問:特性を実装するが使用しない関数を定義すると、Rustで何が起こりますimplか?うまくいきませんか? Goのインターフェイスとは異なり、Rustの型システムには型パラメーターがありinterface{}、コンパイラーとランタイムが実際に型を認識している間、適切なジェネリックなどを実行できます。例えば、 trait Seq<T> …
64 go  rust 

6
サービスレイヤーとDAO —なぜ両方ですか?
私はSpringMVC、Hibernate、およびJava Webアプリケーションの例でいくつかのデータベースを使用しています。 これを行ういくつかの異なる方法がありますが、このSpring 3とhibernateの統合チュートリアルの例には、モデルクラス、ビュー(jsp内)、およびコントローラーのサービスクラスとdaoクラスがあります。 私の質問は、サービスとDAOクラスの両方が同じことをしないのですか?なぜ両方が必要なのですか? これは私が実際に使用していたチュートリアルです:http : //fruzenshtein.com/spring-mvc-security-mysql-hibernate/

3
Java 8 java.timeクラスにgetMillis()メソッドがないのはなぜですか?
Java 8には、パッケージjava.timeに日付と時刻のまったく新しいライブラリがあります。これは、以前にJodaTimeを使用したり、独自の日付処理ヘルパーメソッドを作成したりする必要があるユーザーにとって非常に歓迎されるものです。このパッケージの多くのクラスはタイムスタンプを表し、タイムスタンプgetHour()から時間getMinute()を取得する、タイムスタンプから分を取得する、タイムスタンプからナノを取得するなどのヘルパーメソッドを持っていgetNano()ます... getMillis()タイムスタンプのミリ秒を取得するために呼び出されるメソッドがないことに気付きました。代わりに、methodを呼び出す必要がありますget(ChronoField.MILLI_OF_SECOND)。私には、図書館の矛盾のように思えます。そのようなメソッドが欠落している理由を誰かが知っていますか、またはJava 8がまだ開発中であるため、後で追加される可能性がありますか? https://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html ここで定義されているクラスは、インスタント、期間、日付、時刻、タイムゾーン、期間など、主要な日時の概念を表しています。これらはISOカレンダーシステムに基づいています。これは、予言的なグレゴリオ暦のルールに基づいた事実上の世界カレンダーです。すべてのクラスは不変であり、スレッドセーフです。 各日時インスタンスは、APIによって便利に利用できるようになっているフィールドで構成されています。フィールドへの低レベルのアクセスについては、java.time.temporalパッケージを参照してください。各クラスには、あらゆる種類の日付と時刻の印刷と解析のサポートが含まれています。java.time.formatカスタマイズオプションについては、パッケージを参照してください... この種類のクラスの例:https : //docs.oracle.com/javase/8/docs/api/java/time/LocalDateTime.html 2007-12-03T10:15:30など、ISO-8601カレンダーシステムのタイムゾーンのない日時。 LocalDateTimeは、日時を表す不変の日時オブジェクトであり、多くの場合、年月日日時分秒として表示されます。年間通算日、曜日、通年など、他の日付および時刻フィールドにもアクセスできます。時間はナノ秒の精度で表されます。たとえば、「2007年10月2日13:45.30.123456789」という値は、LocalDateTime...
64 java  java8 

7
構成データ:単一行のテーブルと名前と値のペアのテーブル
ユーザーが設定できるアプリケーションを書いたとしましょう。この「構成データ」をデータベースに保存するには、2つのパターンが一般的に使用されます。 単一行のテーブル CompanyName | StartFullScreen | RefreshSeconds | ... ---------------+-------------------+------------------+-------- ACME Inc. | true | 20 | ... 名前と値のペアのテーブル ConfigOption | Value -----------------+------------- CompanyName | ACME Inc. StartFullScreen | true (or 1, or Y, ...) RefreshSeconds | 20 ... | ... 両方のオプションを実際に見てきましたが、どちらにも明らかな利点と欠点があります。 単一行の表は、使用できる構成オプションの数を制限します(通常、行の列の数は制限されているため)。追加の構成オプションごとに、DBスキーマの変更が必要です。 名前と値のペアの表では、すべてが「文字列で入力」されています(ブール値/日付/その他のパラメーターをエンコード/デコードする必要があります)。 (もっとたくさん) どのオプションが望ましいかについて、開発コミュニティ内でコンセンサスがありますか?

4
JSFを使用しない理由[非公開]
StackExchangeは初めてですが、あなたが私を助けることができると思いました。 レガシーJSPソリューションを置き換える新しいJava Enterpriseアプリケーションを作成しています。多くの変更により、UIとビジネスロジックの一部は完全に再考され、再実装されます。 Java EEの標準であるJSFが最初に考えられました。最初は良い印象がありました。しかし今、私は機能的なプロトタイプを実装しようとしていますが、それを使用することに関して本当に深刻な懸念があります。 まず第一に、それは私が今まで見た中で最悪で最も雑然とした無効な擬似HTML / CSS / JSミックスを作成します。ウェブ開発で学んだすべてのルールに違反しています。さらに、レイアウト、デザイン、ロジック、サーバーとの通信など、決して緊密に結合されるべきではないものが一緒に投げられます。CSSでスタイリングしたり、UIキャンディー(構成可能なホットキー、ドラッグアンドドロップウィジェットなど)を追加したりなど、この出力を快適に拡張する方法がわかりません。 第二に、それはあまりにも複雑です。その複雑さは際立っています。あなたが私に尋ねると、それは基本的なウェブ技術の貧弱な抽象化であり、最終的には不自由で役に立たない。私にはどんな利点がありますか?考えてみれば、なし。何百ものコンポーネント?さらに、数万のHTML / CSSスニペット、数万のJavaScriptスニペット、および数千のjQueryプラグインが表示されます。これは本当に多くの問題を解決します-JSFを使用しない場合はありません。または、フロントコントローラーパターン。 そして最後に、2年後にはやり直さなければならないと思います。最初のGUIモックアップをすべて実装する方法がわかりません(さらに、チームにはJSFエキスパートがいません)。どういうわけか一緒にハッキングできたかもしれません。そして、さらにあります。ハックをハッキングできると確信しています。しかし、いつかは行き詰まってしまいます。サービス層より上のすべてのものがJSFを制御しています。そして、最初からやり直す必要があります。 私の提案は、JAX-RSを使用してREST APIを実装することです。次に、クライアント側のMVCでHTML5 / Javascriptクライアントを作成します。(またはMVCのフレーバー..)ところで。部分的なAndroidフロントエンドも開発しているため、とにかくREST APIが必要になります。 私は、JSFが今日の最良のソリューションであることを疑っています。インターネットが進化しているので、なぜこの「レーキ」を使用する必要があるのか​​わかりません。 さて、賛否両論とは何ですか?JSFを使用しないという点を強調するにはどうすればよいですか?私の提案よりもJSFを使用する長所は何ですか?

11
ANSI Cが私たちの新しいプロジェクトには不十分であると上司に納得させるにはどうすればよいですか?[閉まっている]
数か月前、社内で開発されたテスト機器を制御し、一連の測定値を記録するアプリの開発を開始しました。シンプルなUIが必要です。また、継続的な記録が必要なため、スレッドが必要になる可能性があります。このアプリケーションは数年間使用され、この期間中は多くのコンピューターサイエンスの学生によって維持されます。 私たちの上司は約30年前に卒業しました(犯罪とは見なされません。私もその半分以上を背負っています)。このアプリケーションをANSI Cで開発することを義務付けています。ほぼ全時間であり、したがって、彼は私たちが何をしているかを理解できなければなりません。彼はまた、抽象データ型を使用しないことを決定しました。彼は私たちが使用したいグローバル変数(ため息)の名前のリストさえも私たちに与えました。 私は実際にしばらくこのアプローチを試しましたが、すべてのポインター操作が安全で、すべての文字列が正しいサイズであることを確認するのに本当に時間がかかりました。さらに、実際に手元の問題に関連するコードの行数は、コードベースのほんの一部でした。数日後、私は全体を廃棄し、C#を使用して新たに始めました。私たちの上司はすでにプログラムが実行されていることを見ており、その動作方法は気に入っていますが、別の言語で書かれていることを知りません。 来週、私たち二人はソースコードを調べるために会い、彼は「それを維持する方法を知っている」。私はちょっと怖いです、そして、私は私の決定を支持するためにどんな議論を使用することができるかあなたたちから聞きたいです。 ward病なあなたのもの、

18
長い方法は常に悪いですか?[閉まっている]
そのため、先ほど見てみると、長い方法が悪い習慣であるというコメントがいくつかありました。 私は、長い方法が悪い(そして他の人からの意見が欲しい)ことにいつも同意するかどうかわかりません。 たとえば、オブジェクトをビューに送信する前にオブジェクトの処理を少し行うDjangoビューがあります。長いメソッドは350行のコードです。パラメータを処理するようにコードを作成しました。クエリセットの並べ替え/フィルタリングを行い、クエリが返したオブジェクトをビットごとに処理します。 そのため、処理は主に条件付き集計であり、データベースでは簡単に実行できない複雑なルールがあるため、メインループの外側で宣言された変数があり、ループ中に変更されます。 variable_1 = 0 variable_2 = 0 for object in queryset : if object.condition_condition_a and variable_2 > 0 : variable 1+= 1 ..... ... . more conditions to alter the variables return queryset, and context したがって、理論によれば、すべてのコードをより小さなメソッドに分解する必要があります。そのため、ビューメソッドは最大1ページの長さであると見なされます。 ただし、過去にさまざまなコードベースで作業していたため、あるメソッドから次のメソッドに絶えずジャンプして、その最も外側のメソッドを頭の中で保持する必要がある場合、コードが読みにくくなることがあります。 適切にフォーマットされた長いメソッドを使用すると、内部メソッドで隠されないため、ロジックをより簡単に確認できます。 コードをより小さなメソッドに分解することもできますが、多くの場合、2つまたは3つのことに使用される内部ループがあるため、より複雑なコード、または1つだけではなく2つまたは3つ(またはタスクごとに内部ループを繰り返すこともできますが、パフォーマンスが低下します)。 だから、長い方法が必ずしも悪いわけではない場合はありますか?メソッドを1つの場所でのみ使用する場合、メソッドを記述する場合は常にありますか? 更新:1年以上前にこの質問をしたようです。 そこで、ここで(混合)応答の後にコードをリファクタリングし、メソッドに分割しました。これは、データベースから関連オブジェクトの複雑なセットを取得するDjangoアプリであるため、テストの引数が出ていません(おそらく、テストケースに関連するオブジェクトを作成するのにおそらく1年の大半を費やしていたでしょう。誰も文句を言う前の作業環境)。コードのその部分のバグを修正することは今やや簡単ですが、大したことではありません。 前 : #comment 1 bit …

5
インターフェイスを明示的または暗黙的に実装することの違いは何ですか?
Visual Studioでは、インターフェイスを右クリックして、[インターフェイスの実装]または[インターフェイスの明示的な実装]を選択できます。 public class Test : ITest { public string Id // Generated by Implement Interface { get { throw new NotImplementedException(); } } string ITest.Id // Generated by Implement Interface Explicitly { get { throw new NotImplementedException(); } } } この2つの間に見られる唯一の違いは、インターフェイスを明示的に実装することを選択した場合、作成時にインターフェイスのプロパティとメソッドにインターフェイス名が追加されることです。 そのメソッド/プロパティがどこから来たのかを見ることができるので、コードが少し読みやすくなりますが、これはクラスの使用方法やコンパイル方法に違いをもたらしますか?暗黙的または明示的にインターフェイスを実装する場合、それは本当に重要ですか?
64 c#  syntax 

11
なぜ低レベルのプログラミングでは、不可解な短い識別子がまだそれほど一般的ですか?
以前は、命令/レジスタ名を短くする非常に良い理由がありました。これらの理由はもはや当てはまりませんが、低レベルのプログラミングでは依然として短い暗号名が非常に一般的です。 どうしてこれなの?古い習慣が破れにくいからといって、それとももっと良い理由があるのでしょうか? 例えば: Atmel ATMEGA32U2(2010?):(のTIFR1代わりにTimerCounter1InterruptFlag)、ICR1H(の代わりにInputCapture1High)、DDRB(の代わりにDataDirectionPortB)など。 .NET CLR命令セット(2002):(のbge.s代わりにbranch-if-greater-or-equal.short)など。 長くて、暗号化されていない名前を使用する方が簡単ではありませんか? 回答および投票する際は、以下を考慮してください。ここで提案されている説明の多くは高レベルのプログラミングにも同様に当てはまりますが、コンセンサスは概して、1つまたは2つの単語からなる非暗号化名を使用することです(一般に理解されている頭字語は除外されます)。 また、あなたの主な議論が紙の図の物理的な空間に関するものである場合、これはアセンブリ言語またはCILには絶対に適用されないことを考慮してください。さらに、簡潔な名前が収まるが読みやすいものが図を悪化させる図を見せていただければ幸いです。ファブレス半導体会社での個人的な経験から、読みやすい名前はうまく適合し、より読みやすい図になります。 高レベル言語ではなく、低レベルプログラミングで簡潔な名前を望ましいものにする高レベル言語とは異なる、中核となるものは何ですか?

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