ソフトウェア工学

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

4
フォームの継承を避ける必要があるのはなぜですか?
VB4を学び、ボタンをフォームにドラッグし、そのボタンをダブルクリックし、魔法のように恵まれたイベントハンドラーにコードを入力したことを覚えています。QBASICから来た私は、「VB」の「V」に興奮しました。ビジュアルデザイナーは、スライスされたパン以来、文字通り最高のものでした。 もちろん、これらすべてをプログラムで行うことはできますが、「V」の魔法は非常に魅力的で、ボタンをドラッグせざるを得ませんでした。私たちはその道を進むように勧められました。 しかし、それから数年前、私はC#と.netフレームワークについて学び始め、自分が知っていると思っていたすべてのものが窓から出て行ったばかりの方法に魅了されました。VB6には、.netで完全に明らかにされた多くの魔法がありInitializeComponentsます。たとえば、コンストラクターとメソッドを見てみましょう。後者では、ツールボックスからドラッグしたすべてのコントロールインスタンス、登録したすべてのイベント、およびデザイナーで設定したプロパティが見つかります。 そして、それは結構です...私は推測します。ただ、私は何が起こっているのかを "所有"していないように感じます。このコードは、デザイナーを介してのみ変更でき、煩わしいことに煩わされます。「OK」と書かれたボタンをあるフォームから別のフォームにコピーするたびに(その兄弟の「キャンセル」とともに)、実際にコードを複製しているのは間違いです。教皇は言っています。 宗教と思想学派はさておき、すべての客観性において、代わりに基本フォームからフォームを派生させて、[OK]ボタン(およびそのすべての友達)を基本フォーム上に置くべきではありませんか?FormBaseから派生するのようなものDialogFormBase。すべてのクラスはすぐに作成されます...コードを入力してください。ボタンは、クラスがどのようにインスタンス化されるかに応じて作成されます(つまり、コンストラクタ列挙引数がどのボタンを作成するかを決定します)、コントロールは、分割パネルとフローレイアウトパネルの配置内にレイアウトされ、次のようにフォームに注入されますContentメインコンテンツパネルに収まります。これは、ASP.netがマスターページとコンテンツプレースホルダーで行うことではありませんか?新しい「マスターページ」が必要になったときにフォームを派生させますが、この新しい「マスターページ」は依然としてベースフォームクラスから派生しているため、アプリケーション全体でビジュアルが一貫しています。 私にとっては、WinFormsのデザイナでこれまでに行った他のどのコードよりもはるかに多くのコードの再利用であり、難しくもありませんでした。また、自分で制御できない200行のメソッドがコードに散らばっていません。私が好きな場所にコメントを付けてください。デザイナーによって上書きされることはありません。:私はそれだけでこのリンクを私にもたらしたものですパターンとアーキテクチャの問題、だと思う共通の機能を共有するWindowsフォームのベストデザイン私は除いて、上のスポットに気づいた、そこに答えは、私は正確に何を示唆しています実行しますが、デザイナーの考慮事項のため、フォームの継承はお勧めしません。それは私が得ない部分です。コード構造の考慮事項のため、特にフォームとコントロールの継承に関しては、デザイナーを壊す以外に避けるべき理由はないと思います。 私たちはすべて怠惰になることはできないので、どの部分が欠けていますか?

4
Perlのプログラミングスタイル
私はJavaで作業しているため、基本的にはコーディング中にOOPパラダイムを使用しています。私はPerlで仕事を始めようとしていて、Perl開発者が従うパラダイムは何だろうと思っていました。wikiでは、多くのパラダイムをサポートしていると述べていますが、スクリプト言語であるため、これを理解しているとは思いません。 だから私の質問は、Javaで慣れ親しんだオブジェクト指向パターンはPerlの慣用句ですか?それとも効果的なPerlを書くためにデザインスタイルに大幅な変更が必要ですか? 注:これはPerlを批判する問題ではありません。私は実際にはPerlで作業する必要があり、現在のプログラミング方法がどのように変わるかを理解したいと思います。

4
非決定論的なリソース管理は漏れやすい抽象化ですか?
私が見ることができることから、リソース管理には、決定論的破壊と明示的破壊という2つの一般的な形式があります。前者の例は、C ++デストラクタとスマートポインタまたはPerlのDESTROYサブです。後者の例は、Rubyのブロックから管理リソースへのパラダイムまたは.NETのIDisposeインターフェイスです。 新しい言語は後者を選択しているようです。おそらく、参照カウント以外の種類のガベージコレクションシステムを使用することの副作用としてです。 私の質問はこれです:スマートポインターまたは参照カウントガベージコレクションシステムのデストラクタ-ほとんど同じこと-が暗黙的かつ透過的なリソース破壊を可能にすることを考えると、それは明示に依存する非決定的タイプよりもリークの少ない抽象化です表記? 具体的な例を挙げましょう。単一のスーパークラスのC ++サブクラスが3つある場合、特定の破棄を必要としない実装がある可能性があります。多分それは別の方法でその魔法をします。特別な破棄を必要としないという事実は関係ありません。すべてのサブクラスが同じように使用されます。 別の例では、Rubyブロックを使用しています。2つのサブクラスはリソースを解放する必要があるため、スーパークラスはコンストラクターでブロックを使用するインターフェースを選択します。ただし、他の特定のサブクラスは特別な破棄を必要としないため、ブロックを必要としない場合もあります。 後者はリソース破壊の実装の詳細をリークしますが、前者はリークしませんか? 編集:たとえば、RubyとPerlの比較は、一方は確定的破壊を持ち、もう一方はそうではないため、より公平である可能性がありますが、両方ともガベージコレクションされます。

1
Clojureで「ref」の履歴にアクセスする
refのドキュメントには:max-historyオプションが示され、「refは読み取り要求を処理するために必要に応じて動的に履歴を蓄積する」と記載されています。REPLには履歴があることがわかりますが、refの以前の値を見つける方法はわかりません。 user=> (def the-world (ref "hello" :min-history 10)) #'user/the-world user=> (do (dosync (ref-set the-world "better")) @the-world) "better" user=> (let [exclamator (fn [x] (str x "!"))] (dosync (alter the-world exclamator) (alter the-world exclamator) (alter the-world exclamator)) @the-world) "better!!!" user=> (ref-history-count the-world) 2 おそらくthe-worldの値は「hello」、「better」、「better !!!」です。その履歴にアクセスするにはどうすればよいですか? その履歴にアクセスできない場合、後で照会できる値の履歴を保持するデータ型はありますか?それとも、なぜデータベースが作成されたのですか?
9 clojure  stm 

9
条件文で(位置<サイズ)がこのような一般的なパターンになるのはなぜですか?
条件ステートメント(IF)では誰もがを使用(position &lt; size)していますが、なぜですか? 慣習だけですか、それとも正当な理由がありますか? 野生で発見: if (pos &lt; array.length) { // do some with array[pos]; } めったに見つかりません: if (array.length &gt; pos) { // do some with array[pos]; }

3
良いC可変長配列の例[終了]
休業。この質問には、より焦点を当てる必要があります。現在、回答を受け付けていません。 この質問を改善してみませんか?質問を更新して、この投稿を編集するだけで1つの問題に焦点を当てます。 4年前休業。 この質問はSOでかなりフリーズしたレセプションを得たので、そこで削除して代わりにここで試すことにしました。ここにも当てはまらないと思われる場合は、少なくとも私が求めている例を見つける方法の提案についてコメントを残してください... C99 VLAを使用することで、現在の標準ヒープを使用するC ++ RAIIメカニズムなどよりも優れた例を挙げていただけますか? 私が後の例は次のとおりです: ヒープを使用するよりも簡単に測定できる(おそらく10%)パフォーマンスの利点を実現します。 アレイ全体をまったく必要としない、適切な回避策はありません。 実際には、最大サイズを固定する代わりに、動的サイズを使用するメリットがあります。 通常の使用シナリオでスタックオーバーフローが発生することはほとんどありません。 C ++プロジェクトにC99ソースファイルを含めるためのパフォーマンスを必要とする開発者を誘惑するのに十分な強さである。 文脈上のいくつかの明確化を追加:C99の意味と、標準C ++に含まれていないように私は、VLAを意味:int array[n]どこn変数です。そして、私はそれが他の標準(C90、C ++ 11)によって提供される代替手段に勝るユースケースの例の後にいます: int array[MAXSIZE]; // C stack array with compile time constant size int *array = calloc(n, sizeof int); // C heap array with manual free int *array = new int[n]; // …
9 c++  c  stack  heap 

3
メソッドのパラメーター型、戻り値の型、およびプロパティ型の具体性に関する規則
少し前に、メソッドパラメータの型、戻り値の型、およびプロパティの型の具体性についての「経験則」を読みましたが、覚えていません。 それはあなたの戻り値の型をできるだけ具体的にそしてあなたのパラメータ型をできるだけ抽象的に保つことについて何かを言った...またはその逆 実際に良いアドバイスなのか悪いアドバイスなのかはわかりませんので、ご自身の考えがあればコメントしてください。 乾杯。

3
複数の(社内)プロジェクト用の文字列翻訳データベースの構築
私たちの会社には、次のような文字列を格納する既存の翻訳ms-sqlテーブルがあります。 Id | Key | Language | Value 1 | hello-world | nl-BE | Hallo Wereld 2 | hello-world | en-GB | Hello World システムには3つの言語があり、将来的には最大で約10言語に増えると思います このテーブルは、複数の非常に異なるプロジェクト(約60のプロジェクト、主にWebサイト/ Webアプリケーションと一部のWebサービス)によって読み取られ、それぞれが翻訳データベースへのデータベース接続を開き、翻訳をキャッシュします。 フロントエンド開発者からのフィードバックは、翻訳の入力または変更のためのUIのUIの最大の欠点は、どのプロジェクトがどの文字列を使用するかを理解できないことです。 彼らは時々それを使って7つのプロジェクトを壊していることを知らずに文字列を変更します。 これで、ユーザーは次のように入力するだけthis.Translate("Hello World")で、あとはシステムが処理します。 もちろん、私はそれらを次のようなものに強制することもできますthis.Translate("Hello World","AwesomeApplication1")が、それは多くの多くのプロジェクトにわたってかなりのリファクタリングを必要とするようです。 このソリューションを提供するにはどうしますか?開発者として、翻訳に「プロジェクト名」をどのように提供しますか?これをデータベースにどのように保存しますか? 重要な注意:翻訳の再利用は一元化されたデータベースの核心なので、次のようにして翻訳を1つのプロジェクトにスコープします 1|hello-world|nl-BE|Hallo Wereld|MyAwesomeApplicatoin1 5|hello-world|nl-BE|Hallo Wereld!|MyAwesomeApplicatoin2 本当に望まれるオプションではありません。 私は次のようなものが好きです: 1|hello-world|nl-BE|Hallo Wereld|MyAwesomeApplicatoin1,MyAwesomeApplicatoin2 または、テーブルに名前を置くだけの外部キーと同等です。 更新 データベースを正規化するというアドバイスに基づいて、これまでに次のようなものを考え出しました。 //this allows me to …
9 c#  resources 

2
「コマンド」と「複合」を組み合わせて時間遅延をシミュレートするにはどうすればよいですか?
学習課題(私は学校にいない-何か新しいことを学ぼうとしている老人)として、伝播遅延を組み込んだ論理ゲートシミュレーションを記述しようとしています。また、ユーザーはゲートをグループ化して、より高レベルのオブジェクトを作成できる必要があります。 問題にデザインパターンを適用したいのですが、苦労しています。 Head First Design Patternsを読んでいますが、コマンドパターンは、遅延のある回路を通る電気パルスをシミュレートするのに適した方法であることがわかりました。また、複合パターンはネストされたユニットをシミュレートするための優れた方法であることがわかります。2つを混ぜる方法がわかりません。 つまり、ゲートをループすると、ゲート「x」が発火するはずです。15ナノ秒の遅延があるので、現在のゲーム時間から15 nsのタイムスタンプでコマンドを作成します。ディスパッチャーはどこですか?ダイナーの例では、コマンドが「注文」であるため、ウェイトレスとコックはそれぞれコマンドをディスパッチし、遅延を導入するオプションがあります。「複合」ゲートがある場合、独自のディスパッチャーも持っていますか?キューを管理するためにシングルトンを使用する必要がありますか? 私は見つけたものを読みましたが、それでも正しい方向へのプッシュが必要です。 /programming/2015549/using-command-design-pattern /programming/12016314/client-server-command-design-pattern-with-variable-delays /programming/10560892/composite-of-commands-design-pattern /programming/8874705/how-can-i-calculate-propagation-delay-through-series-of-combinational-circuits-u

2
グラフサイクルのスポッティング-簡単な説明
簡単な言葉でグラフのサイクルを見つける方法を理解するのに役立つ人がいますか? 私はこれや他のいくつかのウィキペディアのページなどの他の質問を読みましたが、それらは数学の専門用語にかなり早く下降しているようです。 私はJavaのグラフのモデル、モデリングノード、および「イン」と「アウト」のエッジを持っています-モデルは一方向にのみ接続されたノードを認識しているため、開始点としてリーフノードを見つけることができ、私の計画はルート上で見つけた他のすべてのノードのリストを保持しながら、「ウォーク」ごとにこれらの各リーフノードからグラフを遡ります。既にリストに何かが表示されている場合は、グラフでサイクルを見つけたことがわかります。ただし、これは少し単純化した感じです。 これは解決された問題だと思います。簡単に説明できればいいのですが。 -エース
9 graph 

1
Rebolは関数型プログラミング言語ですか?
私はRebolに遭遇し、それについて疑問に思いました。 ここから次のスクリプトに遭遇しました: use [feed questions answers][ feed: load-xml/dom http://stackoverflow.com/feeds/tag/rebol questions: map-each entry feed/get-by-tag &lt;entry&gt; [ find/match entry/get &lt;id&gt; "http://stackoverflow.com/q/" ] answers: make block! length? questions foreach question questions [ question: load-xml/dom join http://stackoverflow.com/feeds/question/ question foreach entry next question/get-by-tag &lt;entry&gt; [append answers entry/tree] ] insert clear feed/find-element &lt;entry&gt; answers feed/flatten ] …

1
フォーマット文字列内で '{}'を使用すると、Pythonicと見なされますか?
私はあなたが書くことができることを学びました '{}{}'.format(string_a, string_b) の代わりに '{0}{1}'.format(string_a, string_b) Pythonでは、順番に1つずつスロット化したい場合は、文字列フォーマットパラメータの数字を省略できます。 これはPythonicと見なされますか? 注:「Pythonic」は慣用的なPythonコードを意味するPythonプログラマの間で一般的に使用される用語です。Pythonカルチャー内では、スタイルの質問について明確なコンセンサスが得られる傾向があります。特に、このような非常に具体的な質問の場合、「それを行うには1つ、できれば1つだけの明白な方法があるはずです」という言語の明確な設計哲学を考えると、これは、「Pythonの禅」から引用されています。これは、「Pythonic」とは何かを定義するのに大いに役立つ一連の格言であり、Pythonのすべてのディストリビューションに含まれています(Pythonインタープリターのコマンドラインで入力import thisして確認してください)。

4
新しい仕事で使用する予定の以前の発明(ソフトウェア/フレームワーク)があります。仕事中に著作権を改善すると、著作権はどうなりますか?
新しい仕事を始める前にあなたが以前の発明をリストする標準フォームに記入しましたので、雇用主はあなたがそれらの著作権を持っていることを法的に知っています。しかし、私が新しい仕事でこの発明(ソフトウェアコード/フレームワーク)を使用したい場合、たとえば、彼らのために働いている間に私のコードの何かを変更/改善した場合、彼らはそれについて著作権の主張がありますか? 共有の所有権のようなものを聞いたことがあります。次のようなもの:あなたは以前に行われたことを所有し、雇用主は雇用中にそれに対して行った改善を所有します。一度改善すると改善がなくなるので、そのようなことはあなたの製品を改善するために必要なインセンティブを吸収し、奪います。:( 誰かが以前にこの状況を経験し、コードを保護できるようにいくつかのアイデアを共有できますか?


6
エンコーダのユニットテストはどのように行いますか?
私はこのようなものを持っています: public byte[] EncodeMyObject(MyObject obj) 私はこのようにユニットテストをしてきました: byte[] expectedResults = new byte[3]{ 0x01, 0x02, 0xFF }; Assert.IsEqual(expectedResults, EncodeMyObject(myObject)); 編集:私が提案した2つの方法は次のとおりです。 1)上記の例のように、ハードコードされた期待値を使用します。 2)デコーダーを使用してエンコードされたバイト配列をデコードし、入力/出力オブジェクトを比較します。 方法1で見られる問題は、非常に壊れやすく、多くのハードコードされた値を必要とすることです。 方法2の問題は、エンコーダーのテストがデコーダーの正常な動作に依存することです。エンコーダー/デコーダーが同じ場所で同じように破損している場合、テストで誤検知が発生する可能性があります。 これらが、このタイプのメソッドをテストする唯一の方法である場合があります。その場合は問題ありません。この種のテストにもっと良い戦略があるかどうかを確認するために質問しています。作業中の特定のエンコーダーの内部を明らかにできません。この種の問題をどのように解決するか一般的に尋ねていますが、内部は重要ではないと思います。特定の入力オブジェクトが常に同じ出力バイト配列を生成すると想定します。

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