ソフトウェア工学

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

5
インターフェイスに代わる機能プログラミングとは何ですか?
「機能的な」スタイルでプログラミングしたい場合、インターフェイスを何に置き換えますか? interface IFace { string Name { get; set; } int Id { get; } } class Foo : IFace { ... } たぶんTuple<>? Tuple<Func<string> /*get_Name*/, Action<String> /*set_Name*/, Func<int> /*get_Id*/> Foo; そもそもインターフェイスを使用している唯一の理由は、特定のプロパティ/メソッドを常に利用できるようにしたいからです。 編集:私が考えている/試みていることについてのいくつかの詳細。 たとえば、次の3つの関数を取るメソッドがあります。 static class Blarf { public static void DoSomething(Func<string> getName, Action<string> setName, Func<int> getId); } Bar私のインスタンスでこのメソッドを使用できます: class …

3
プログラマーは私の半成人向けのWebサイトを構築しません。どうして?[閉まっている]
閉まっている。この質問はトピック外です。現在、回答を受け付けていません。 この質問を改善したいですか? 質問を更新して、 Software Engineering Stack Exchangeのトピックになるようにします。 4年前に閉鎖されました。 私は長い間このウェブサイトを完成させたいと思っていました。 私は自分が望むものをきちんと整理して書き上げただけでなく、幻想のアイデアを与えるために偽のページのフォトショップで行われた明確な例を持っていて、隠された驚きなしに、私はプログラマーの夢の仕事になると思いました。 残念ながら、どの会社もウェブサイトに触れません。それについて違法なものはありません。これは、プロのドミナトリスの成人向けリストです。世の中にもっとひどくてハードコアなサイトがあり、これが単なるリストであるとき、私は大したことが何であるかわかりません。プロドミネーションは、米国および世界のほとんどで合法的な職業です。人々はサイトに触れたくないだけです。本当に奇妙です。サイトのすべての情報と詳細が完全かつ明確にレイアウトされています。返事が得られないか、遠隔地の大人には触れないという人がいます。 これには理由がありますか?

1
メソッドごとに1つのパラメーターのみを必要とする連鎖メソッドは、カリー化と同等ですか?
私は最近Rubyをいじくり回しており、純粋なオブジェクト指向言語(および純粋ではないものでも)で1つのパラメータのみを取り、連鎖するメソッドを作成することは、スタイル?そうでない場合は、なぜですか?この件に関する詳細かつ厳密な回答をいただければ幸いです。

2
統合テストを削除するのに十分な単体テストのカバレッジがあるかどうかを知るにはどうすればよいですか?
私はレガシーシステムで作業しています(つまり、テストなしで作成されたという意味です)。外部から機能をテストする統合テストを作成して、システムの一部をテストしようとしました。 これにより、コードの破損を心配することなく、コードの一部をリファクタリングする自信が得られます。しかし、問題は、これらの統合テストを実行するのに2分以上かかり、数分かかることです。また、それらは維持するのが苦痛です。それらはそれぞれ数千行のコードをカバーしており、そのうちの1つが壊れた場合、その理由をデバッグするのに1時間かかることがあります。 私は最近行ったこれらの機能変更のために多くの単体テストを書いてきましたが、コミットする前に常に新しいデプロイを行い、すべての統合テストを実行します。この時点で、ユニットテストと統合テストの一部がテスト内容と重複していることがわかりました。 統合テストを削除できるように、適切な単体テストが不適切な統合テストを適切にカバーしていることをどのようにして知ることができますか?

3
作成するオープンソースプロジェクトの識別子、パッケージ、または名前空間で自分の名前を使用しないようにするにはどうすればよいですか?
私は自分の時間に多くの開発をしています。私が取り組んでいるこれらのプロジェクトはすべて、これまでの楽しみと学習のためだけのものです。私は通常、Mavenを使用してJava開発を行いますが、.NETおよびPythonで手を出すことでも知られています。私が取り組んでいるプロジェクトはすべてオープンソースライセンスを使用していますが、それらのほとんどはパブリックコードリポジトリにはありません。 Java / Mavenの開発では、ユニークgroupId(「com.mydomain」など)およびユニークpackage(ディレクトリ)構造を使用する必要があります。通常、groupId.NET開発でnamespacesはJava packageコンセプトと同様の規則を使用するユニークを推奨します。一意性を確保するために、私は通常、ドメイン名の1つを部分を逆にして使用します(例:「ca.jessewebb」)。これは非常に一般的な方法だと思います。 私は、新しいオープンソースのJava / Mavenプロジェクトを作成する初期段階にあり(「newproj」と呼びましょう)、GitHubに配置したいと思います。GitHubのユーザー名は「jessewebb」なので、次のようなURLが付与されますhttps://github.com/jessewebb/newproj。「newproj.com」ドメイン名をわざわざ登録したくないので、「ca.jessewebb」と「ca.jessewebb.newproj」をそれぞれgroupIdおよびとして使用することにしpackageました。 コード内およびプロジェクトのホームの一部(GitHub URL内)に個人的なIDが存在することで、潜在的な貢献者が私のプロジェクトに関与することについて再考する可能性があります。これは問題であり、私はそれはしたくない私のプロジェクト。代わりに、自分がプロジェクトを所有していないというメッセージを伝えることができればいいと思います。さて、正直に言って、私のプロジェクトはコミュニティの関与を増やすとは思えないので、それほど大したことではありませんが、これは貢献者になることを思いとどまらせる可能性を避けるためのさらに多くの理由と考えています。 別の例として、数年前にGoogle Codeプロジェクトを作成しました(「oldproj」と呼びましょう)。プロジェクトを作成したとき、Google Codeでホストすることを知っていたのでgroupId、「com.googlecode.oldproj」というパッケージ名を使用しました。これは、Google Codeがすべての新しいプロジェクトに提供するデフォルトのドメイン名の逆です。これはそれほど素晴らしいアイデアではないことが判明しました。1年ほど後、私はコードを別のリポジトリに移動し、これらの識別子の名前を変更する必要がありました(私は持っていませんでしたに...)。当時、私はドメイン名を所有していなかったため、「oldproj.com」というドメイン名を購入し、それを使用しました。これは、プロジェクトに独自のアイデンティティを与え、どこでもコードに自分の名前を刻印していなかったので、これが好きでした。「jessewebb.ca」ドメイン名を簡単に登録し、「ca.jessewebb.oldproj」をパッケージ名として使用することもできましたが、当時も同じ懸念があったため、登録しませんでした。 だから私の質問は... パッケージ/名前空間の一意性を維持しながら、オープンソースプロジェクトを作成するときに自分の(ドメイン)名を使用しないようにするにはどうすればよいですか? プロジェクトが勢いを増すにつれて、ドメイン名を登録することは理にかなっていますが、これを前もって行うのはばかげており、お金の無駄です。コードでドメイン名を使用するために実際にドメイン名を所有する必要はありませんが、それは間違っていると感じ、その間にあなたの下から不法占拠者を奪う可能性があります。他の人はこのジレンマについてどうしますか?独自の識別子の一部として元の開発者のIDを含む人気のある(広く使用されている、大規模なコミュニティなどの)オープンソースプロジェクトの例はありますか?

6
保証のないOSSソフトウェアを使用している場合、製品が目的に合っていると主張できますか?
私は、クライアントにとって有効で目的に合った製品に取り組んでいます。 LAMPスタック(PHP / Cake)上に構築されているため、GPL、MIT、PHP、APACHEライセンスがあります。 「現状有姿」、いかなる種類の保証または条件もなしに、明示、黙示を問わず、タイトル、非侵害、商品性、または特定目的への適合性の保証または条件を含むがこれらに限定されない。お客様は、作品の使用または再配布の適切性を判断する責任を単独で負い、本ライセンスに基づく許可の行使に関連するリスクを負います。 私の製品は有効であり、目的に合っているという理論的根拠: 署名されたUAT文書は、妥当性と目的への適合性を証明します。 スタックは、開発者、業界、およびエンドユーザー(netcraft、gartnerなどの統計情報)で広く使用されているため、目的に合っているというコンセンサスが得られています。(つまり、保証免責事項の目的適合性ステートメントをある程度無視することができます) これは有効なポイントですか?自分のソフトウェアが目的に合っていると主張できますか?

1
Microsoft Public License vs MIT?
私は新しいプラグイン(flexbox)を使用していますが、MS-PLライセンスに遭遇しました。 過去には、主にMITとApacheのライセンスプロジェクトを使用してきたので、このプロジェクトの主な違いが何なのかわかりません。 以下にリンクがあります:http : //opensource.org/licenses/MS-PL 誰でも私に違いを説明するのを手伝ってくれますか?私は通常マイクロソフトに警戒しているので、この製品がこれに付属しているという事実は私を緊張させます。

4
デメテルの法則は、結合と結合に関するオブジェクト指向システムにどのように適用されますか?[閉まっている]
閉じた。この質問はより集中する必要があります。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集するだけで1つの問題に焦点を当てるように質問を更新します。 6年前に閉鎖されました。 デメテルの法則は、結合と結合を備えたオブジェクト指向システムにどのように適用されますか? 私は「ソフトウェア開発と専門的実践」という本を読んでいて、LoDに関する章に出くわし、その原理がオブジェクト指向システムにどのように適用されるのか興味がありました。

5
複数のCPU /コアが同じRAMに同時にアクセスできますか?
これは私が推測するものです: 2つのコアがRAM内の同じアドレスにアクセスしようとした場合、一方が他方にアクセスするのを待つ必要があります。二、彼らはそれぞれアクセスすることができましたように、各コアが同じアドレスにアクセスしようとしている時間は、彼らはまだ、そのRAMがキャッシュされていて、同時にキャッシュを。 2つのコアが同じRAMの異なるアドレスにアクセスしようとすると、一方が他方にアクセスするのを待たなければなりません。 言い換えれば、RAMを集中的に使用するプログラミングタスクでは、コアごとに複数回RAMの同じアドレスから読み取る必要がなければ、マルチプロセッシングはあまり役に立たないと思います。 だから、複数のCPU /コアが同じRAMに同時にアクセスできますか、または私が言っていることは正しいですか?

2
再販売を防ぐオープンソースライセンス
TFSのアドインであるオープンソースプロジェクトがあります(つまり、開発者とTFSを使用している人向けです)。 現在GPLを使用しています。しかし、GPLがライセンスで何をしようとしているのかを実際に表していないことがわかりました。 私は自分のコードを、それを使いたいすべての人に無料で提供したいと思っています。そして、あなたがそれを修正して使用するなら、それも素晴らしいことです。変更をオープンソースにする必要はありません。 しかし、誰かが私のコードをビルドして販売することをブロックしたいと思います。または、変更して販売します。(それをしたい人は、私とは別個のライセンスを交渉する必要があります。) 再販売を防止するが、それをダウンロードする個人/会社に完全な非販売使用を許可するオープンソースライセンスはありますか?

5
Java(Android)での多重継承の適切な回避策
複数の継承を必要とするコードの適切な実装に概念的な問題がありますが、これは多くのオブジェクト指向言語では問題になりませんが、プロジェクトはAndroid用であるため、multipleのようなものはありませんextends。 私はそのような単純な異なる基底クラスから派生し、活動の束を持ってActivity、TabActivity、ListActivity、ExpandableListActivity、などまた、私は私がに配置する必要があり、いくつかのコードの断片を持っているonStart、onStop、onSaveInstanceState、onRestoreInstanceStateおよびすべての活動で他の標準のイベントハンドラ。 すべてのアクティビティの単一の基本クラスがある場合、特別な中間派生クラスにコードを配置し、それを拡張するすべてのアクティビティを作成します。残念ながら、複数の基本クラスがあるため、これは当てはまりません。しかし、コードの同じ部分をいくつかの中間クラスに配置することは、進むべき道ではありません。 別のアプローチは、ヘルパーオブジェクトを作成し、上記のイベントのすべての呼び出しをヘルパーに委任することです。ただし、これにはヘルパーオブジェクトを含める必要があり、すべてのハンドラーをすべての中間クラスで再定義する必要があります。したがって、ここでの最初のアプローチに大きな違いはありません-まだ多くのコードの重複。 Windowsで同様の状況が発生した場合、基本クラス(ActivityAndroid のクラスに「対応する」)をサブクラス化し、適切なメッセージを(1か所で)トラップします。 このためにJava / Androidで何ができますか?Javaインストルメンテーション(実際の例もあります)などの興味深いツールがあることは知っていますが、私はJavaの第一人者ではありません。 他の適切な解決策を見逃した場合は、それらに言及してください。 更新: Androidで同じ問題を解決することに興味がある人のために、簡単な回避策を見つけました。Applicationクラスが存在します。これは、とりわけインターフェイスActivityLifecycleCallbacksを提供します。すべてのアクティビティの重要なイベントをインターセプトし、重要なイベントに値を追加できるようにするために必要なことを正確に行います。このメソッドの唯一の欠点は、APIレベル14から使用できることです。多くの場合、これは十分ではありません(今日ではAPIレベル10のサポートが一般的な要件です)。

2
Gitリポジトリの構造
これが重複する場合は申し訳ありませんが、私は見た。 Gitに移行します。Subversionでは、\ trunk、\ branches、および\ tagsフォルダを使用することに慣れています。 Gitを使用すると、ブランチを切り替えると作業ディレクトリの内容が置き換えられるため、以前の作業方法がGitに当てはまらないと仮定するのは正しいでしょうか? 私の推測では、gitignoreとreadme.txtを含むレポフォルダーがあり、それからレポを構成するプロジェクトのフォルダーがあります。

5
依存ソフトウェアコンポーネントのバージョン番号付けのベストプラクティスを探している
相互に依存しているソフトウェアコンポーネントのバージョン番号付けを行うための適切な方法を決定しようとしています。 もっと具体的に見てみましょう: ソフトウェアコンポーネントAは組み込みデバイスで実行されるファームウェアであり、コンポーネントBは通常のPC(Linux / Windowsマシン)用のそれぞれのドライバーです。これらは、カスタムプロトコルを使用して互いに通信しています。当社の製品は開発者も対象としているため、両方のコンポーネントの安定版と不安定版(実験版)を提供します(ファームウェアはクローズドソースで、ドライバーはオープンソースです)。私たちの最大の困難は、通信プロトコルでAPIの変更を処理する方法です。 ドライバーに互換性チェックを実装している間(ファームウェアバージョンがドライバーのバージョンと互換性があるかどうかをチェックします)、バージョン番号付けの複数の方法について議論し始めました。 私たちは1つの解決策を思いつきましたが、車輪を再発明したいとも感じました。これがプログラマー/ソフトウェア開発者コミュニティーからフィードバックを得たい理由です。これはよくある問題だと私たちは考えているからです。 だからここに私たちのソリューションがあります: 広く使用されているmajor.minor.patchをフォローする予定ですバージョン番号、安定/不安定バージョンには偶数/奇数のマイナー番号を使用するです。APIに変更を導入する場合、マイナー番号を増やします。 この規則は、次の状況例につながります。 現在の安定版ブランチは1.2.1で、不安定版は1.3.7です。現在、unstableの新しいパッチによりAPIが変更され、新しい不安定なバージョン番号が1.5.0になります。不安定なブランチは安定していると見なされます。たとえば、1.5.3では、1.4.0としてリリースします。 以下の関連する質問のいずれかに対する回答があればうれしいです。 上記の問題を処理するためのベストプラクティスを提案できますか? 私たちの「カスタム」慣習は良いと思いますか? 説明されている規則にどのような変更を適用しますか?
15 versioning 

3
子から親へのリンク-悪い考えですか?
私は私の親がそれが子供だと知っている状況がありますが(duh)、子供が親を参照できるようにしたいです。その理由は、子供が自分がそう感じたときに、自分自身を最も重要または最も重要でないものとして指定できるようにすることです。子がこれを行うと、親の子の上部または下部に移動します。 過去に、親に対して参照するために子のWeakReferenceプロパティを使用しましたが、面倒なオーバーヘッドが追加されると感じていますが、それが最善の方法かもしれません。 これは悪い考えですか?この機能をどのように異なる方法で実装しますか? 更新1:コンテキストの追加。これはレンダリングシステムなので、親コンテナはグループ化されたウィンドウのリストです。「私は最も重要です!」という子項目(ウィンドウ)基本的に、残りのウィンドウの上部にレンダリングしたい。 親は、これらの子をグループ化するための単なる論理コンテナーです。イベントを追加して、リクエストが一番上にあることを通知するのは良い考えです。しかし、実装(子が親に対して何をしたいのか)は別として、なぜあなたは子→親リンクを持ちたくないのでしょうか?二重にリンクされたリストがこれを行うので、人々は何かを行き来できます。

4
テストごとに1つのアサーションのみが必要な場合。複数の入力をテストする方法は?
私はいくつかのテストケースを構築しようとしていますが、テストケースごとのアサーションの数を制限するようにしてください。 したがって、私の質問は、複数の入力を持つ関数をテストするための最善の方法は何ですか?たとえば、ユーザーからの文字列を解析し、分数を返す関数があります。文字列は、週、時間、日、および分数"5w6h2d1m"にw, h, d, m対応する形式で指定できます。 「テストルールごとに1つのアサーション」に従う場合、入力のバリエーションごとに複数のテストを作成する必要がありますか?それはばかげているように見えるので、代わりに私は次のようなものを持っています: self.assertEqual(parse_date('5m'), 5) self.assertEqual(parse_date('5h'), 300) self.assertEqual(parse_date('5d') ,7200) self.assertEqual(parse_date('1d4h20m'), 1700) 1つのテストケース。もっと良い方法はありますか?

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