ソフトウェア工学

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

5
型に算術を設定できるプログラミング言語はありますか?
好奇心から、型に算術を設定して新しい型を作成できる言語はありますか?何かのようなもの: interface A { void a(); void b(); } interface B { void b(); void c(); } interface C = A & B; // has b() interface D = A | B; // has a(), b() and c() interface E = (A & B) ^ B; // has c() 一部の言語ではこれらのアイデアを表現できることを知っています(つまり、JavaはList<Comparable …

4
カレーや部分塗布の何が特別ですか?
私は関数型プログラミングに関する記事を毎日読んでおり、可能な限りいくつかのプラクティスを適用しようとしています。しかし、私はカレーや部分的なアプリケーションで何がユニークなのか理解していません。 例として、このGroovyコードを見てみましょう。 def mul = { a, b -> a * b } def tripler1 = mul.curry(3) def tripler2 = { mul(3, it) } 私は違いが何であるかを理解していないtripler1とtripler2。どちらも同じではないですか?「カレー化」は、Groovy、Scala、Haskellなどの純粋または部分的な関数型言語でサポートされています。ただし、別の名前付きまたは匿名を作成するだけで、同じこと(左カレー、右カレー、nカレー、または部分アプリケーション)を実行できます。tripler2ほとんどの言語(Cでも)でパラメーターを元の関数(など)に転送する関数またはクロージャー ここで何か不足していますか?Grailsアプリケーションでカレーや部分的なアプリケーションを使用できる場所はありますが、「どうして違うの?」 教えてください。 編集:皆さんは、デフォルトのパラメーターを元の関数に転送する別の関数を作成/呼び出すよりも、部分的なアプリケーション/カリー化が単に効率的であると言っていますか?

2
プロジェクトのGitリポジトリを構築する方法は?
Drupalのコンテンツ同期モジュールに取り組んでいます。ウェブサイトに配置され、ウェブサービスを介してコンテンツを公開するサーバーモジュールがあります。別のサイトにあり、定期的にコンテンツをフェッチしてインポートするクライアントモジュールもあります。 サーバーはDrupal 6で作成されます。クライアントはDrupal 7で作成されます。Druapl7バージョンのサーバーが必要になるでしょう。そして、来年リリースされると、クライアントとサーバーの両方のDrupal 8バージョンが必要になります。 私はgitとソース管理にかなり慣れていないので、gitリポジトリをセットアップするための最良の方法は何だろうと思っていましたか?インスタンスごとに個別のリポジトリがある場合、つまり、次のようになります。 Drupal 6 server = 1 repository Drupal 6 client = 1 repository Drupal 7 server = 1 repository Drupal 7 client = 1 repository etc または、サーバー用のリポジトリとクライアント用のリポジトリを用意し、各Drupalバージョンのブランチを作成するほうが理にかなっていますか? 現在、私は2つのリポジトリを持っています-1つはクライアント用、もう1つはサーバー用です。

7
テストに時間がかかる場合にトランクを安定させる方法は?
3組のテストスイートがあります。 実行に数時間しかかからない「小さな」スイート 複数時間かかる「中」のスイートで、通常は毎晩(毎晩)実行されます 実行に1週間以上かかる「大きな」スイート 短いテストスイートもたくさんありますが、ここではそれらに焦点を当てません。 現在の方法論は、トランクへの各コミットの前に小さなスイートを実行することです。次に、ミディアムスイートが毎晩実行され、午前中に失敗したことが判明した場合は、昨日のコミットのどれが原因であるかを特定し、そのコミットをロールバックして、テストを再試行します。大規模なスイートでは、同様のプロセスが、毎晩ではなく毎週のみ行われます。 残念ながら、ミディアムスイートはかなり頻繁に失敗します。つまり、トランクが不安定になることがよくあります。これは、変更を加えてテストするときに非常に煩わしいことです。トランクからチェックアウトするとき、それが安定していることを確実に知ることができず、テストが失敗した場合、それが私のせいかどうかを確実に知ることができないので、それは迷惑です。 私の質問は、トランクを常に最高の状態に保つような方法でこれらの種類の状況を処理するためのいくつかの既知の方法論がありますか?例:「特別な事前コミットブランチにコミットし、夜間が経過するたびにトランクを定期的に更新する」。 そして、それがSVNのような集中化されたソース管理システムであるか、gitのような分散型システムであるかは重要ですか? ちなみに、私は物事を変更する能力が限られているジュニア開発者ですが、私が経験しているこの痛みに対処する方法があるかどうかを理解しようとしています。

5
「プログラミングエラー」の例外-アプローチは適切ですか?
私は現在、例外の使用方法を改善しようとしていますが、プログラミングエラーを示す例外(たとえば、誰かが引数としてnullを渡した、またはオブジェクトが破棄された後にメソッドを呼び出した)と、呼び出し側の障害ではない操作(I / O例外など)。 これらの2種類の例外はどのように異なる方法で処理する必要がありますか?エラー例外を明示的に文書化する必要があると思いますか、または関連する前提条件を文書化するだけで十分ですか?また、明らかな場合(たとえば、ObjectDisposedException破棄されたオブジェクトでメソッドを呼び出す場合)、前提条件またはエラー例外のドキュメントを省略できますか?
9 java  c#  c++  exceptions 

5
BDD仕様ワークショップで成功するにはどうすればよいですか?
今日、仕様ワークショップを開催することにより、ソフトウェア開発プロセスにBDDを導入しようとしました。 このワークショップには、2人の開発者、1人のテスター、1人のビジネスアナリストがいました。ワークショップは1時間30分続き、その終わりまでに、新機能のいくつかのBDDシナリオを理解することができました。私たちは見逃す可能性のあるシナリオと難しいシナリオを見つけることに焦点を当てようとしました。 ワークショップの最後には、実際にワークショップに不満を抱く人もいました。 ある開発者は、ビジネスアナリストから直接シナリオを渡され、彼女と一緒にそれらをレビューするのに慣れていたので、自分の時間を浪費していると感じました。ビジネスアナリストは、私たちのシナリオのカバレッジに自信がありませんでした(他の重要なことを見逃している可能性があると感じていました)。しかし、より重要なのは、このワークショップは自分でこれらのシナリオすべてを理解できたので、時間の無駄でもあると感じました。そして、より短い期間で。 この実験的なワークショップは1時間30分続きましたが、その終わりまでに、私たちがやったことについて十分な自信が持てませんでした。 BAの脳からのルール。 だから私の質問は、そのようなワークショップが実際にどのように機能するかです。理論的には、開発する新しい機能がある場合、ツリー「amigos」(dev / tester / ba)を同じ部屋に配置して、例を使用して新しい機能のさまざまな要件を共同で作成できるようにします。そのメリットはすべてわかります。特に知識の共有と共通の製品/最終目標/達成済みのビジョンに関して。 この実験から、私たちの結論は、実際にはそれ以上に効果的な費用であるということであった最初の例で彼自身の仕事にBAを持っているだけで、その後見直し/ 3「アミーゴ」で再加工するシナリオを持っています。BAが自分で作業できるようにすることで、実際に何かを見落とすことが少なくなり、後でシナリオを確認して再確認できるようになります。新しい機能のすべての要件を真剣にカバーするには、単純な1回のブレインストーミング/意図的なディスカバリーセッションで十分だとは考えていません。ビジネスアナリストは、実際にはその種のものに最適な人物です。私たちにできる最善のことは、彼女が書いたものをレビューして、共通の理解があるかどうかを確認することです(それにより、彼女のシナリオの一部を書き直したり、見逃した可能性のある新しいシナリオを追加したりできます)。 それで、実際にそれを効果的に機能させるにはどうすればよいですか?
9 bdd 

3
副作用のあるクロージャーは「機能的なスタイル」と見なされますか?
最新のプログラミング言語の多くは、クロージャ、つまりコード(ブロックまたは関数)の概念をサポートしています。 値として扱うことができるため、変数に格納し、コードのさまざまな部分に渡し、プログラムの一部で定義し、同じプログラムのまったく異なる部分で呼び出すことができます。 変数が定義されているコンテキストから変数をキャプチャし、後で呼び出されたときに(おそらくまったく異なるコンテキストで)変数にアクセスできます。 以下は、Scalaで記述されたクロージャーの例です。 def filterList(xs: List[Int], lowerBound: Int): List[Int] = xs.filter(x => x >= lowerBound) 関数リテラルx => x >= lowerBoundには、同じ名前のlowerBound関数の引数によって閉じられている(バインドされている)自由変数が含まれていますfilterList。クロージャはライブラリメソッドに渡さfilterれ、通常の関数として繰り返し呼び出すことができます。 私はこのサイトで多くの質問と回答を読んでいますが、私が理解している限り、閉鎖という用語は関数型プログラミングと関数型プログラミングスタイルに自動的に関連付けられることがよくあります。 ウィキペディアの関数プログラミングの定義は次のとおりです。 コンピュータサイエンスでは、関数型プログラミングは、計算を数学関数の評価として扱い、状態や変更可能なデータを回避するプログラミングパラダイムです。状態の変化を強調する命令型プログラミングスタイルとは対照的に、関数の適用を強調します。 そしてさらに [...]関数コードでは、関数の出力値は関数に入力された引数にのみ依存します[...]。副作用をなくすことで、プログラムの動作の理解と予測がはるかに容易になります。これは、関数型プログラミングを開発するための主要な動機の1つです。 一方、プログラミング言語によって提供される多くのクロージャー構成では、クロージャーが非ローカル変数をキャプチャーし、クロージャーが呼び出されたときにそれらを変更できるため、それらが定義された環境に副作用が生じます。 この場合、クロージャは関数型プログラミングの最初のアイデアを実装します(関数は他の値のように移動できるファーストクラスのエンティティです)が、2番目のアイデアは無視します(副作用を回避します)。 副作用のあるこのクロージャの使用は、関数型スタイルと見なされますか、それとも、関数型と非関数型プログラミングスタイルの両方に使用できるより一般的な構造と見なされますか?このトピックに関する文献はありますか? 重要な注意点 副作用の有用性や副作用のあるクロージャーの有用性については質問していません。また、副作用の有無にかかわらず、クロージャーの長所/短所についての議論には興味がありません。 このようなクロージャの使用が関数型プログラミングの支持者によって依然として関数型スタイルと見なされているかどうか、または逆に関数型スタイルを使用する場合にそれらの使用が推奨されていないかどうかを知りたいだけです。

3
どうすれば「依存関係管理」を主張できますか?
私は現在、ビルド(ala Maven、Ivy、NuGet)の依存関係管理を採用し、共有モジュールの内部リポジトリを作成することを主張しています。このビルド手法の主なセールスポイントは何ですか?私がこれまで持っているもの: 共有モジュール、特にバージョンのアップグレードの配布とインポートのプロセスを容易にします。 共有モジュールの依存関係を正確に文書化する必要があります。 ソース管理から共有モジュールを削除し、チェックアウト/チェックインを高速化および簡略化します(20以上のライブラリを使用するアプリケーションがある場合、これは実際の要因です)。 組織で使用されているサードパーティのライブラリをより詳細に制御または認識できます。 私が見逃しているセールスポイントはありますか?改善の指標を示す研究や記事はありますか?

2
新しい開発を始める前、またはリリースにタグを付ける前にバージョンをバンプするのはどちらが良いですか?
新しい開発を開始する前にバージョンをバンプするプロジェクトもあれば、リリースにタグを付けるときにバージョンをバンプするプロジェクトもあります。 どちらのアプローチが優れていますか? 新しいフェーズの開始時にバージョン番号が変更されていない場合、開発者はバージョン番号を変更するのを忘れて、プログラムをリリースするだけです。 リリースにタグを付ける前にバージョン番号が変更された場合、バージョン番号(タグとMakefile / AssemblyInfo.cs)は一致しません。 git describe 現在のリビジョンがv1.2.3.4より後の場合、v1.2.3.4-15-g1234567が表示されることがありますが、ファイルはすでにv1.2.3.5に変更されています。

4
コマンド処理アプリケーションを実装するにはどうすればよいですか?
数値を受け取り、その数値でコマンドを処理するシンプルな概念実証アプリケーション(REPL)を作成したいと考えています。 例:1から始めます。次にadd 2、「」と書いて、3を与えます。次にmultiply 7、「」と書いて、21を与えます。次に、素数かどうかを知りたいので、「is prime」と書きます(現在の数値- 21)、それは私に偽りを与えます。「is odd」は私に真実を与えるでしょう。等々。 さて、コマンドが少ない単純なアプリケーションの場合、単純なものでもコマンドswitchを処理できます。しかし、拡張性が必要な場合、機能を実装するにはどうすればよいですか?コマンドパターンを使用しますか?言語用のシンプルなパーサー/インタープリターを構築できますか?「multiply 5 until >200」のようなより複雑なコマンドが必要な場合はどうなりますか?再コンパイルせずにそれを拡張する(新しいコマンドを追加する)簡単な方法は何でしょうか? 編集:いくつかのことを明確にするために、私の最終的な目標はWolframAlphaに似たものを作ることではなく、(数値の)プロセッサのリストを作ることです。しかし、最初はゆっくりと始めたいと思います(単一の数値について)。 私は、Haskellを使用してリストを処理する方法に似たものを念頭に置いていますが、非常に単純なバージョンです。コマンドパターン(または同等のコマンド)のようなもので十分か、それとも目標を達成するために新しいミニ言語とパーサーを作成する必要があるのか​​と思いますか。 Edit2:すべての回答に感謝します。すべては私にとって非常に役に立ちましたが、エマッドカリームが最も私を助けてくれたので、それを答えとして選びます。再度、感謝します!

4
プロのアプリケーション開発者は、GITやSubversionなどのバージョン管理システムをどのように使用しますか?
私は初心者の開発者であり、プロジェクトのニーズを満たすために、GITやSubversionなどの専門的なツール(これらのツールについて十分に理解していません)をどのように使用するのか、最初から疑問に思っていました。彼らがそれを使用する場合、どのようにそのようなものを設定しますか? 私のアプリケーションはそれほど大きくなく、まだチームで作業していません。それらは私にとって非常に役立ちますか? このサイトにはツールの使用方法に関する質問がありますが、初心者のサポートが必要です。

5
ネストされたクラスは過小評価されていますか?
私は他の誰もが知らないことを知っていると言っているわけではありませんが、ネストされたクラスを使用してますます多くのデザインを解決してきました。設計メカニズム。 これは私に質問を導きます:彼らが私を噛むように戻ってきたときに私が発見する理由のために、私は本質的に悪い道を進んでいますか、またはネストされたクラスはおそらく過小評価されているものですか? 次に、私がそれらを使用した2つの例を示します。https://gist.github.com/3975581-1つ目は、密接に関連する階層的なものを一緒に保つのに役立ち、2つ目は、保護されたメンバーへのアクセス権をワーカーに与えました...
9 c#  design 

1
(共通の)フレームワーク名と競合するクラス名で何をすべきか
コンポーネントの最も明白なクラス名がフレームワークによって使用される場合、正確に何をする必要がありますか?私の場合、HTTPリクエストを記述するクラスを作成する必要があります。もちろん、最も一般的な名前はSystem.Web.HttpRequestとして「取得」されます。私は何をすべきか?このプロジェクトはWebコンテキストで使用されるので、System.Web名前空間をインポートしないように強制したり、手動ですべてのクラス名を入力したりしないでください。 これに対処する通常の方法は何ですか?私はこれを思いつくことができます: プロジェクトの短縮名をクラス名の前に付ける 同じことを意味する別の名前を付けてみてください(私は試しましたが、何も思いつきません) ユーザーに名前空間の選択を強制する
9 c#  .net  naming  namespace 

2
例外後にelseを使用する(または使用しない)
次のコードを検討してください。 if (x == 1) { throw "no good; aborting" ; } [... more code ...] 今、このコードを考えてみましょう: if (x == 1) { throw "no good; aborting" ; } else { [... more code ...] } 2つのケースはまったく同じように機能します。最初のケースには、のコードの残りの部分を「囲む」必要がないという利点がありますelse。2番目の方法には、elsefor every を明示的に持つという慣例に従うという利点がありますif。 誰かが一方を他方に有利に支持するような確かな議論を提供できますか?

2
航空機システムで使用されているアセンブリ言語
今日、私の講師は、航空機システムがアセンブリ言語でプログラミングされている理由は、記述されているプログラムのエラーが少ないためだと述べました。このステートメントは本当ですか?彼が私たちの意見について尋ねたとき、私はアセンブリがより速いプログラムを作成できると私は言ったので、それはリアルタイム指向の航空機システムプログラムにとって良い言語です。私はグーグルで検索しましたが、講師の発言を明確にする記事が見つかりません。
9 assembly 

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