ソフトウェア工学

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

6
オブジェクトのモックが難しいシステムをテストするにはどうすればよいですか?
私は次のシステムで作業しています: Network Data Feed -> Third Party Nio Library -> My Objects via adapter pattern 最近、使用しているライブラリのバージョンを更新したときに問題が発生しました。これにより、とりわけ、タイムスタンプ(サードパーティライブラリがとして返すlong)がエポック後のミリ秒からエポック後のナノ秒に変更されました。 問題: サードパーティのライブラリのオブジェクトを模擬するテストを作成する場合、サードパーティのライブラリのオブジェクトについて間違えた場合、テストは間違っています。たとえば、タイムスタンプの精度が変更され、モックが間違ったデータを返したため、ユニットテストを変更する必要があることに気づきませんでした。これはライブラリのバグではありません。ドキュメントの何かを見逃したために発生しました。 問題は、実際のデータフィードがないと実際のデータ構造を生成できないため、これらのデータ構造に含まれるデータについて確信を持てないことです。これらのオブジェクトは大きくて複雑で、多くの異なるデータが含まれています。サードパーティライブラリのドキュメントは貧弱です。 質問: この動作をテストするためにテストを設定するにはどうすればよいですか?テスト自体は簡単に間違っている可能性があるため、この問題を単体テストで解決できるかどうかはわかりません。さらに、統合システムは大きく複雑であり、見落としがちです。たとえば、上記の状況では、タイムスタンプの処理をいくつかの場所で正しく調整していましたが、そのうちの1つが見つかりませんでした。システムはほとんど統合テストで正しいことを行っているように見えましたが、本番環境(より多くのデータがある)に展開すると、問題が明らかになりました。 現在、統合テストのプロセスがありません。テストは基本的に、ユニットテストを適切な状態に保ち、問題が発生したときにさらにテストを追加し、テストサーバーに展開して問題が正しかったことを確認してから、運用環境に展開します。モックが間違って作成されたため、このタイムスタンプの問題は単体テストに合格し、すぐに明らかな問題を引き起こさなかったため統合テストに合格しました。QA部門がありません。

1
引数を返す関数の名前?
何もせず、引数を取らず、何も返さない関数は、伝統的にa noopまたはno-op と呼ばれます。noopの例を以下に示します。 function noop(){} http://en.wikipedia.org/wiki/NOP それで、引数を返すだけで、他には何もしない関数を指す名前がありますか?この種の関数の例: function(a){return a}
34 functions 

6
2つのキューを使用してスタックを実装する意味は何ですか?
次の宿題の質問があります。 2つのキューを使用して、スタックメソッドpush(x)およびpop()を実装します。 これは私には奇妙に思えます: スタックは(LIFO)キューです 実装に2つのキューが必要な理由がわかりません 私は周りを検索しました: GeeksForGeeks スタックオーバーフロー そして、いくつかの解決策を見つけました。これが私がやったことです: public class Stack<T> { LinkedList<T> q1 = new LinkedList<T>(); LinkedList<T> q2 = new LinkedList<T>(); public void push(T t) { q1.addFirst(t); } public T pop() { if (q1.isEmpty()) { throw new RuntimeException( "Can't pop from an empty stack!"); } while(q1.size() > 1) …
34 java  stack 

7
ほとんどの主流言語が、3者間ブール比較の「x <y <z」構文をサポートしないのはなぜですか?
2つの数値(または他の適切に配列されたエンティティ)を比較したい場合は、で比較しx &lt; yます。それらのうち3つを比較したい場合は、高校の代数の生徒が試してみることをお勧めしx &lt; y &lt; zます。私のプログラマーは、「いいえ、それは無効です、あなたはしなければなりませんx &lt; y &amp;&amp; y &lt; z」と答えます。 私が出会ったほとんどの言語はこの構文をサポートしていないようです。これは数学でどれほど一般的であるかを考えると奇妙です。Pythonは注目に値する例外です。JavaScript は例外のように見えますが、実際には、演算子の優先順位と暗黙の変換の単なる残念な副産物です。node.jsでは、と1 &lt; 3 &lt; 2評価されtrueます(1 &lt; 3) &lt; 2 === true &lt; 2 === 1 &lt; 2。 だから、私の質問はこれです:なぜx &lt; y &lt; z期待されるセマンティクスで、プログラミング言語で一般的に利用できないのですか?

8
Object.finalize()のオーバーライドは本当に悪いですか?
オーバーライドに対する主な2つの引数Object.finalize()は次のとおりです。 いつ呼び出されるかを決めることはできません。 まったく呼び出されない場合があります。 私がこれを正しく理解していれば、Object.finalize()それがそんなに嫌いな十分な理由だとは思いません。 オブジェクトの割り当てを解除する適切なタイミングは開発者ではなく、VM実装とGCが決定します。いつObject.finalize()呼び出されるかを決めることが重要なのはなぜですか? 通常、私が間違っている場合は修正Object.finalize()しますが、GCが実行される前にアプリケーションが終了したときのみ呼び出されません。ただし、アプリケーションのプロセスが終了すると、オブジェクトは解放されます。だから、Object.finalize()それが呼び出される必要はなかったので、呼び出されませんでした。開発者が気にするのはなぜですか? 手動で閉じる必要のあるオブジェクト(ファイルハンドルや接続など)を使用するたびに、非常にイライラします。オブジェクトにの実装があるかどうかを常に確認する必要がありclose()、過去のある時点でいくつかの呼び出しを逃したと確信しています。close()実装を入れることでこれらのオブジェクトを破棄するためにVMとGCに任せる方が単純で安全ではないのはなぜObject.finalize()ですか?

6
表現力とは具体的に何を指しますか?
表現力はウィキペディアによって次のように定義されています: ..その言語で表現および伝達できる幅広いアイデア。 「アイデア」とは、マシンと通信できるもの(操作、構造、アルゴリズムなど)を指しますか?それとも、他の人間に言語でキャプチャして伝達できる「人間」の概念を指しますか? 表現力はどのように評価および測定されますか? たとえば、JavaScriptのような言語を使用して、変数がアンダースコアに続く8桁の数字でなければならない/^_[0-9]{8}$/など、変数名に奇妙な制限を課した場合、表現力は失われますか? それとも、それはばかげて迷惑なだけでしょうか? 明確にするために: 言語に固有の一般的なアイデアによって測定される表現力です: 整数と文字列 ループ 条件付き または、言語が表すことができる具体的でユニークなアイデアの数: 整数1、2 ... 2 ^ 32 「キツネの言うこと」を含む文字列 そして「ファパパパパパパパウ」 それぞれのカエルでカエルの私のコレクション 場合カエルがある緑や何かその後、何かを

3
GPLプロジェクトのフォーク:新しいフォークに対する完全な権利を持っていますか、それとも元の所有者との依存関係を持っていますか
私はGPLv2でライセンスされた小さなプロジェクトへの分岐の作成を検討していますが、さまざまなサイトやフォーラムでの調査で答えられなかった非常に具体的な質問がいくつかあります。 コードをフォークすると、私はそうするのと同じライセンス(GPL)の下で新しいプロジェクトをリリースすることを余儀なくされますが、デュアルライセンス(それらの1つ)の下でリリースすることもできますか? プロジェクトをフォークするとき、私は自動的に全体の著作権を所有しますか?これは、たとえば、ライセンスの将来の変更を決定する場合、またはサードパーティにGPLライセンスを適用できる場合に関連します。
34 gpl 

8
開発者がLinuxでインストールウィザードを作成しないのはなぜですか?[閉まっている]
怠lazなどの問題ではないと確信していますが、主に消費者向けアプリの開発者でも、次から次へと進むインストールウィザードを作成しない理由を理解できません。通常、同じアプリにはWindowsとMac OSのインストーラーがあります。Linuxではどうですか? この傾向には技術的な理由がありますか、それとも単なる慣習ですか? 編集(2014年9月9日):この質問は、Windows対Linuxのフレーム戦争を開始するように依頼されていません。私は3つの主要なオペレーティングシステムすべてを使用しましたが、Linuxを除き、他の2つ(WindowsとMac OS)には両方ともインストーラーがあります。Oracleはまだインストールしていませんが、インストールに必要なものは何でも、Linux用のGUIインストーラーを見たことはありません。 はい、Linuxにはパッケージマネージャーがあるため、開発者がインストーラーを作成する必要はありません。しかし、デフォルトのパッケージマネージャーでは時代遅れであるか、単に利用できないという膨大な量のソフトウェアがまだあります。さらに、Linuxはカジュアルユーザー向けのWindowsの代替として販売されているため(Ubuntuはこのドメインで一生懸命努力しています)、ユーザーになじみのある情報を提供する方がはるかに理にかなっています。 たとえば、LAMPスタックをセットアップします。これらはすべてデフォルトリポジトリのオープンソースソフトウェアですが、スクリプトなしですべてを一度に設定できますか?次に、WindowsのWAMPサーバーを見てください。インストーラーを実行するだけで、複数のソフトウェアが相互に機能するようにインストールされます。次に、適切なデフォルトなどを設定します。インストーラーはそれを行うことができますが、パッケージマネージャーはできません。はい、そのオンライン用のスクリプトを見つけることができますが、どこですか?そしてどれ? インストーラーは、過去の時代遅れのテクノロジーではありません。それらはまだ有用であり、95%のユーザーは既にそれらに満足しています。

5
軍事アプリケーションを明示的に禁止する「オープンソース」ライセンス
私は研究者であり、私の研究では多くのプログラミングを行っています。私はオープンソースのコンセプトの大ファンです。特に研究では、透明性と再現性がすでに文化の大きな部分を占めています。私はコミュニティにできる限り貢献し、誰でも使用できるようにコードを公開することもその一環です。 しかし、研究では、作成するものが何に使用されるかについて、常に一定の不確実性の尺度があります。結果や結論を著作権で保護することはできないことを完全に理解していますが、他人が自分のコードを使用する方法を保護できます。また、軍事用アプリケーションに作成したソフトウェアを(合法的に)組み込む方法がないことを確認したいと思います。 一般的なOSSライセンスの短いものといくつかの要約を読みましたが、それらはすべて「コードでお金を稼いでいますか?」という質問だけに焦点を当てているようです。「プログラムで私のコードを利用可能にしますか?」-プログラムが実際にコードで行うことについては何もしません。 あらゆる種類の軍事アプリケーションを明示的に禁止する優れたオープンソースライセンスはありますか? 更新: OSSのしくみをさらに読んだ後、オープンソースライセンスはフィールドを区別できないため、定義によって自分のニーズを満たすライセンスはオープンソースではないことに気付きました。したがって、軍事使用を禁止していることを除いて、オープンソースライセンスに似たライセンスを探しています。このライセンスは、既に存在している、作成されている、または少なくとも実際にライセンスを知っている人がレビューする必要があります。 また、これを実施するのは難しいといういくつかの発言に応えて、はい、私はそれを実現しています。しかし、これは法的意味よりも私自身のほうが重要です。このようなライセンスを使用し、軍組織がとにかく私のコードを使用する場合、彼らは法律を破り、私の明示的な指示がないにもかかわらずそれを行っています。したがって、私が書いたソフトウェアを含むアプリケーションで彼らが行う恐ろしい可能性は、ソフトウェアを私から盗んだので、もはや「私の意識」ではありません。(そしてどこかで私がやったことを彼らが必要とし、私のライセンスが彼らが合法的にそれを使用することを禁じているなら、彼らは同じことをしてそれを使用できるようにする他の誰かのプログラムを手に入れるだろうというナイーブな希望を持っている。常に行うが、彼らは常に法律を遵守する必要があります...) それはいわば、私が実際に法廷で提起することを期待するものではなく、道徳的な保護手段です(私の平凡なコードがCIAによって使用された場合...)

7
RESTful APIは貧弱なドメインモデルを奨励する傾向がありますか?
ドメイン駆動設計とRESTの両方をサービス指向アーキテクチャに適用しようとしているプロジェクトに取り組んでいます。100%REST準拠について心配する必要はありません。リソース指向のHTTP API(〜RichardsonのREST成熟度モデルのレベル2)を構築しようとしていると言った方が良いでしょう。それでも、RPCスタイルのHTTPリクエストの使用は避けようとしています。つまり、例えば、POSTdo を使用するのではなく、RFC2616に従ってHTTP動詞を実装しようとしますIsPostalAddressValid(...)。 ただし、これに重点を置くことは、ドメイン駆動設計を適用しようとする試みを犠牲にしているようです。だけではGET、POST、PUT、DELETEおよびその他のいくつかのほとんど使用されない方法で、私たちは汚いサービスを構築する傾向があり、そして汚いサービスは、貧血のドメインモデルを持っている傾向があります。 POST:データを受信し、検証し、データにダンプします。GET:データを取得して返します。実際のビジネスロジックはありません。また、サービス間でメッセージ(イベント)を使用しますが、ビジネスロジックのほとんどは最終的にその周りに構築されるように思われます。 RESTとDDDは何らかのレベルで緊張していますか?(または、ここで何かを誤解していますか?他の何か間違っているのでしょうか?)RPCスタイルのHTTP呼び出しを回避しながら、サービス指向アーキテクチャで強力なドメインモデルを構築することは可能ですか?

6
一部の関数型プログラミング言語は、関数の適用にスペースを使用するのはなぜですか?
関数型プログラミングのためにいくつかの言語を見てきましたが、なぜ一部のfp言語は関数アプリケーション(および定義)に1つ以上の空白文字を使用するのかと疑問に思いましたが、ほとんどの(すべて?)命令型/オブジェクト指向言語は括弧を使用していますより数学的な方法である。また、後者のスタイルは、括弧がない場合よりもはるかに明確で読みやすいと思います。 したがって、関数f(x)=x²がある場合、それを呼び出すための2つの選択肢があります。 FP: f x 例: ML、Ocaml、F# ハスケル LISP、Scheme(なんとか) 非FP: f(x) 例: ほぼすべての命令型言語(私は知っている、コメント/回答を見る) アーラン Scala(単一の引数に「演算子表記」も許可) 括弧を「除外」する理由は何ですか?

3
通常、Java開発にはC#/。NETよりも多くのサブクラスが含まれますか?
最近、Androidの開発を検討し始めました。これにより、私はJavaソフトウェア開発の世界に戻ってきました。私が最後にJavaで作業したときは、OOPを(私が思うに)今ほど理解していないことを認めます。 私のキャリアでは主にC#を使用していましたが、継承がJavaとC#を使用する方法に驚くべき違いがあることに気付きました。 C#では、ほとんどの状況で継承を回避できるように思われました。通常、当面のタスクは、.NETフレームワークの具体的なクラスを使用して実現できます。 Javaでは、コードサンプルから収集したものから、Javaフレームワークは多くのインターフェイスまたは抽象クラスを提供し、開発者が実装/拡張することを意図しているようです。 これは、スタイルにまで煮詰めるには大きすぎる違いのようです。この背後にある理由は何ですか?これを理解するまで、きれいなJavaコードを書くことはできないと思います。 また、これはAndroid SDKだけに限定されていますか?これはOOPに対するJava全体のアプローチですか? または別の言い方をすれば、 これら2つの言語の設計について、他の言語よりも多かれ少なかれ継承を使用しているように思われますか? 言語が継承を同一に扱い、私の観察が有効であると仮定すると、これは言語ではなくフレームワーク/ライブラリの設計に関連することを意味します。この種のデザインの動機は何でしょうか?

1
表形式プログラミングとは何ですか?
ファルコンプログラミング言語は、表形式のプログラミングをサポートしているとして自分自身をアドバタイズします。 Falconは、手続き型、オブジェクト指向、プロトタイプ指向、機能指向、表形式、メッセージ指向の6つの統合プログラミングパラダイムを提供します。そして、それらすべてを習得する必要はありません。好みの材料を選んで、コードがインスピレーションに従うようにするだけです。 ドキュメントには、(単純な例から明らかであるものを当然のを除いて)平板プログラミングの言語の味がどのように機能するかのビットを展開していますが、言語の独自の構造と構文に焦点を当てていますし、本当にパラダイムのメリットを説明していません。 私はファルコンTableがリレーショナルテーブルとして多かれ少なかれ機能するネイティブ構造であり、リレーショナルクエリ機能を備えたネイティブレコードセットとして記述することができるネイティブオブジェクト構造であると理解していることから、全体が内部的にどのように機能するかについて少し混乱しています。恐ろしい説明、私は知っている(私のOOルーツとテキーラを乱用の長年を非難します)。 表形式プログラミングとは何か、内部でどのように機能するかをよりよく理解するのを手伝ってもらえますか? 明確化:私はないについての質問表形式モデルプログラミング。
34 paradigms 

3
異なるホスト上のgitリポジトリを同期させる
私は小さなプロジェクトを始めることを考えており、gitでバージョン管理をしたいと思っています。 Bitbucketは無料プランで私にとって良い選択肢のようです。ウェブインターフェース、Mac OSクライアントなどの優れたツールがあるため、gitを操作するためのメインツールとして使用したいと思います。しかし、サードパーティのサービスを使用することによって引き起こされる可能性のある偶発的な損害からより高い保護を得るために、リポジトリの2番目のバックアップコピーとしてNASにgitをインストールしたいです。 ここで私の質問は、2つの異なるホストでリポジトリを作成し、それらを同期させることが可能かどうかです。たとえば、週に1回、Bitbucketのリポジトリと一致するようにNASのリポジトリを更新するとします。その後、Bitbucketで何かが発生した場合でも、ローカルNASストレージでの開発の完全な履歴を備えた完全なリポジトリを保持します。 また、完全な履歴を持つ既存のリポジトリを別のgit-serviceにインポートする方法はありますか? ミラーリングが必要だと思います。この記事は、私が必要とするものを正確に説明しているようです。そして、この1としても。 完全な履歴で完全なコピーを作成し、両方のホストのリポジトリに新しいバージョンを自動的にコミットすることさえできると信じています。 私は正しいですか?
34 git 


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