ソフトウェア工学

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

4
「void *」がC ++で暗黙的にキャストされないのはなぜですか?
Cでは、void *他のポインター型にキャストする必要はなく、常に安全に昇格されます。ただし、C ++では、そうではありません。例えば、 int *a = malloc(sizeof(int)); Cでは動作しますが、C ++では動作しません。(注:私はあなたがmallocC ++で、またはその点newで使用すべきではないことを知っています、代わりにスマートポインタおよび/またはSTLを好む必要があります;これは純粋に好奇心から尋ねられます)C ++標準はこの暗黙的なキャストを許可しないのはなぜですか、 C標準はそうですか?

11
友達と小さなプロジェクトをいつ放棄するかを決定する方法に影響する要因は何ですか?[閉まっている]
私は最近、厳しい状況に陥っています。ほぼ8か月間、プログラミング仲間とのゲームに取り組んでいます。私たちは両方とも昨年の8月頃にプログラミングの初心者としてスタートしました。彼は2年目のCS学生であり、私は業界のITサポート技術者であり、多数の書籍とオンラインサブスクリプションを持つ独学のプログラマーです。 私が常に見てきた問題は、コードの塊を書き出すと、多くの場合、一緒に少しハッキングされ、多くの失敗があり、それが私たちの新しいコンセプトである場合、素朴なソリューションでいっぱいです。これは問題ありません。学習中です。最初のパスまたは2回目のパスで、両方のコードが少しハッキングされることを期待しています。問題は、ハッキングされたこれらの動作を実際に修正およびリファクタリングするときに発生します。 私のパートナーは、動作を開始した瞬間にエラーを見ることを露骨に拒否して、彼の新鮮な一緒に行動を保持します。構造の一部からほぼ完璧を主張して、コメントがあり、適切な名前のメソッドとフィールドがあっても、使用することさえできません。どんなに一生懸命努力しても、動作を完全に破壊することなく、それ以上の変更や動作の拡張を妨げる明白な欠陥を彼に見せることはできません。それらはすべて同じクラスに属する可能性があります。ハッキングされたソリューションは、常にハッキングされたままであり、設計が十分に検討されていないため、最初に考案およびテストされたときの設計はそのままです。 新しいコードを自分で作成するのと同じくらい多くの時間をベビーシッターに費やしています。私のパートナーは今夜それを失い、ベンチマーク、一般的な慣行、反論できない証拠に関係なく、彼のコードは彼が最初に作った方法のままであることを明らかにしました。あなたが何かをすることを避けたい理由について本全体が書かれていたとしても、彼はそれが単なる誰かの意見であると主張する彼らの妥当性を認めることを拒否するでしょう。 私は私たちのプロジェクトに強い関心を持っていますが、パートナーと一緒に仕事を続けられるかどうかはわかりません。私には3つの選択肢があります。 コンパイルの時点を過ぎて機能するコードベースを気にするのをやめ、かろうじてリンプしている動作を維持および解析しようとすることに対処します。物事が真剣に壊れ始めたら、彼はそれを見て、根本的に欠陥のあるデザインにただ絆創膏をかける以上のことをしようとするでしょう。 他のはるかに有能な個人によって10年前に見つけられた問題についての無限の議論を続けてください。 このプロジェクトでのプログラミングを停止し、コードの10,000行近くを放棄し、設計に時間を費やす無数の時間を費やして、自分で新しいプロジェクトを見つけてみてください。 この人とこのプロジェクトを続ける価値があるかどうかを判断するには、どのようなアプローチを取ることができますか?または、どの要因が私の決定に影響を与えるべきですか?私たちは多くのコードを書きましたが、必要がない限りこれをあきらめたくありません。

10
馬の群れを考えると、すべてのユニコーンの平均角の長さを見つけるにはどうすればよいですか?
上記の質問は、レガシーコードで発生する一般的な問題、またはより正確には、この問題を解決するための以前の試みに起因する問題の抽象的な例です。 Enumerable.OfType<T>メソッドのように、この問題に対処することを目的とした少なくとも1つの.NETフレームワークメソッドを考えることができます。しかし、最終的に実行時にオブジェクトの型を調べることになってしまうという事実は、私には正しくありません。 それぞれの馬に「ユニコーンですか?」次のアプローチも思い浮かびます。 ユニコーン以外の角の長さを取得しようとすると例外がスローされます(各馬に適切でない機能が公開されます) 非ユニコーンの角の長さのデフォルト値または魔法の値を返します(すべてユニコーンではない可能性のある馬のグループでホーンの統計情報をクランチするコード全体にデフォルトチェックが必要です) 継承を廃止して、馬がユニコーンであるかどうかを示す別のオブジェクトを馬に作成します(潜在的に同じ問題をレイヤーに押し込んでいます)。 これは「無回答」で最もよく答えられると感じています。しかし、この問題にどのようにアプローチし、それが依存する場合、あなたの決定の背景は何ですか? また、この問題が関数型コードにまだ存在するかどうか(または、可変性をサポートする関数型言語にのみ存在するかどうかに関する洞察にも興味がありますか?) これは、次の質問の重複の可能性としてフラグが立てられました: ダウンキャストを回避する方法 その質問への答えは、HornMeasurerすべてのホーン測定を行わなければならないaを所有していることを前提としています。しかし、それは、誰もが馬の角を自由に測定できるという平等主義の原則の下で形成されたコードベースに対する非常に強い課しです。 aがないHornMeasurer場合、受け入れられる回答のアプローチは、上記の例外ベースのアプローチを反映しています。 また、馬とユニコーンが両方とも馬であるかどうか、またはユニコーンが馬の魔法の亜種であるかどうかについてのコメントにもいくらか混乱がありました。両方の可能性を考慮する必要があります-おそらく一方が他方よりも望ましいですか?

6
Javaでの動的コード評価-賢いのか、ずさんなのか?
アプリケーション用にJavaで柔軟なACLフレームワークを作成しようとしています。 多くのACLフレームワークはルールのホワイトリストに基づいて構築されています。ルールはowner:action:resourceの形式です。例えば、 「ジョンはリソースFOOBAR-1を表示できます」 「MARYはリソースFOOBAR-1を表示できます」 「MARYはリソースFOOBAR-1を編集できます」 これは、ルールをデータベースに簡単にシリアル化/永続化できるため魅力的です。しかし、私のアプリケーションには複雑なビジネスロジックがあります。例えば、 「5年以上の年功歴を持つ部門1のすべてのユーザーは、リソースFOOBAR-1を表示できます。それ以外の場合は承認されません」 「部門2のすべてのユーザーは、日付が2016年3月15日以降であれば、リソースFOOBAR-2を表示できます。それ以外の場合は許可されません」 最初に考えたとき、このような無限に複雑なルールを処理できるデータベーススキーマを考案するのは悪夢です。したがって、コンパイルされたアプリケーションにそれらを「焼き付け」、ユーザーごとに評価し、評価の結果としてowner:action:resourceルールを生成する必要があるように思えます。 コンパイルされたアプリケーションにロジックを焼き付けないようにします。 そのため、私はルールを述語:action:resourceの形式で表現することを考えていました。ここで、述語はユーザーが許可されるかどうかを決定するブール式です。述語は、JavaのRhinoエンジンで評価できるJavaScript式の文字列になります。例えば、 return user.getDept() == 1 && user.seniority > 5; そうすることで、述部をデータベースに簡単に永続化できます。 これは賢いですか?これはずさんですか?これはギミックですか?これは過剰に設計されていますか?これは安全ですか(明らかに、JavaはRhinoエンジンをサンドボックス化できます)。

6
他の1つの関数でのみ使用される関数をその関数内に配置する必要がありますか?
具体的には、JavaScriptで記述しています。 私の主な機能が機能Aであるとしましょう。機能Aが機能Bを複数回呼び出し、機能Bが他のどこでも使用されていない場合、機能A内に機能Bを配置するだけですか? それは良い習慣ですか?または、関数Bを関数Aと同じスコープに配置する必要がありますか?

3
ホットフィックスの処理中の複数のアクティブなリリースに対する適切なGitワークフロー
私の製品に最適なGitワークフローを選択しようとしています。パラメーターは次のとおりです。 年に数回のメジャーリリースを行っています。 製品の複数のバージョンが同時にアクティブになっています(v10.1、v11.2など)。 同時に複数のリリースで作業できるようにする必要があります(v12.1で作業できるようになりましたが、リリースの終わりに達すると、v12.2で作業を開始します) 重大なバグが見つかった場合、リリースを修正できる必要があります これまでのところ、ここで私はそれがうまくいくと思う方法です: 単一のリモートリポジトリが使用されます マスターからブランチ12.1を作成します 12.1に基づいて機能ブランチを作成し、コミットして12.1にマージしてプッシュ 将来のリリースで作業を開始する必要がある場合は、12.1に基づいて新しいブランチ12.2を作成します その後、12.1の機能で作業する場合、12.1からブランチを作成し、変更をコミットし、12.1と12.2の両方にマージします 12.2の機能で作業している場合、12.2からブランチを作成し、変更をコミットし、12.2にのみマージします リリース12.1が完了したら、それをマスターにマージし、12.1でマスターブランチにタグ付けします 修正プログラムが必要な場合は、それを必要とする最も古いリリースブランチから修正プログラムブランチを作成し、変更をコミットし、そのリリースと影響を受ける可能性がある将来のリリースのすべてのリリースブランチにマージします。最新の安定版リリースブランチが影響を受けた場合は、マスターにマージします。 私はいくつかの懸念があります: 特に多くの重複する変更があった場合、古いブランチから新しいブランチへのホットフィックスのマージがスムーズなプロセスになるかどうかはわかりません。競合があるように見える場合は、各ブランチで手動で修正プログラムを適用する方が賢明でしょうか 私が見たワークフローモデルは、リリースブランチがあまり生き残っていないようです。いったんリリースがマスターにマージされ、タグが付けられ、削除されます。私の問題は、マスターのタグがすべてある場合、リリースの状態を管理する方法がわからないことです。ブランチで修正する方が簡単なようで、いつでも戻ることができるリリースがあります最新の修正プログラムが含まれています(リリースの修正プログラムにタグを付けることもできます)。マスター内に戻って、修正プログラムが適用されたリリースのコピーを適用し、そのタグを更新する方法があるかどうかはわかりません。 私が見落としているかもしれないことや、私が指定した要件を考慮して物事を達成するより良い方法についてのコメントを歓迎します。

10
ポインターがC言語で保持するデータの「タイプ」とは何ですか?
ポインタがアドレスを保持していることを知っています。ポインターのタイプは、ポインターが指すデータの「タイプ」に基づいて「一般に」知られていることを知っています。ただし、ポインターは依然として変数であり、ポインターが保持するアドレスにはデータ「タイプ」が必要です。私の情報によると、アドレスは16進形式です。しかし、この16進数のデータの「タイプ」はまだわかりません。(16進数が何であるかはわかっていますが、10CBA20たとえば、この文字列は整数ですか?整数ですか?アドレスにアクセスしてそれ自体を操作したい場合は、そのタイプを知る必要があります。私が尋ねている理由です。)
30 c  pointers 

9
セルフホスティングコンパイラが新しい言語の通過儀礼と見なされるのはなぜですか?
尊敬に値するために、言語がセルフホスティングコンパイラを使用するか、少なくとも持っていることを人々が期待していると、今では多くの場所で聞いています。 これがなぜなのか興味があります。コンパイラは書くべき非常に重要なソフトウェアのようであり、すべての言語がそれらを作成するのに適しているわけではないと思います。より良い結果をもたらす何かに努力を費やす方が理にかなっていますか?

7
メソッドが不正な入力を返すことができないことがわかっている場合でも、メソッド呼び出しの戻り値を検証する必要がありますか?
呼び出しているメソッドがそのような期待を満たしているとわかっていても、メソッドが呼び出した期待値を満たしていることを検証することで、メソッド呼び出しの戻り値に対して防御する必要があるかどうか疑問に思っています。 与えられた User getUser(Int id) { User temp = new User(id); temp.setName("John"); return temp; } 私はすべき void myMethod() { User user = getUser(1234); System.out.println(user.getName()); } または void myMethod() { User user = getUser(1234); // Validating Preconditions.checkNotNull(user, "User can not be null."); Preconditions.checkNotNull(user.getName(), "User's name can not be null."); System.out.println(user.getName()); } …

5
条件を確認する必要がある場合、分岐予測はどのように機能しますか?
私はhttps://stackoverflow.com/q/11227809/555690から分岐予測に関する一般的な答えを読んでいたのですが、私を混乱させる何かがあります: あなたが正しく推測した場合、それは続けます。 あなたが間違っていると推測した場合、船長は停止し、後退し、スイッチを入れるように叫びます。その後、他のパスで再起動できます。 毎回正しいと思うなら、、列車は停止する必要はありません。 間違った推測をしすぎると、列車は停止、バックアップ、再起動に多くの時間を費やします。 しかし、これは私が得られないものです:あなたの推測が正しかったか間違っているかを知るには、とにかく状態チェックを行わなければなりません。どちらの方法でも同じ条件チェックを実行している場合、分岐予測はどのように機能しますか? 私が言おうとしているのは、とにかく同じ条件チェックを行っているので、分岐予測はまったく分岐予測がないこととまったく同じではないということです。(明らかに私は間違っていますが、わかりません)

3
「開始」、「実行」、「実行」の方法は良い習慣ですか?
現在、Startメソッドを実装する多くのクラスを持つコードベースで作業しています。これは私にとって二段階の構成のように思えますが、私は常に悪い習慣だと考えていました。これとコンストラクターの違いはわかりません。 通常のオブジェクト構築の代わりに開始メソッドを使用するのが適切なのはいつですか? コンストラクターを使用するのはいつですか? 編集:私はそれが関連しているとは思わないが、プログラミング言語はC#であり、JavaまたはC ++に等しく適用できる

1
動的フォームビルダーフォームとデータベース設計 [閉まっている]
ユーザーが独自のWebベースのフォーム(テキストボックス、選択など)を作成し、ユーザーが入力できるようにWebに公開できるとします。 動的なフォームに結び付けるためにデータベースを設計する方法に関するリソースやアドバイスはありますか? たとえば、フォームごとに子テーブルを作成しますか、または特定のフォームの異なるバージョンを作成しますか?

6
「クラウドコンピューティング」と「クライアント/サーバー」の違いは何ですか?
新しい「クラウドコンピューティング」企業のCEOが今日の財務テレビ番組で彼の会社について説明しているのを見て、彼は「クラウドコンピューティングは昔ながらのクライアントサーバーコンピューティングより優れている」と言った。 今、私は混乱しています。誰かがクライアントサーバーとは対照的に「クラウドコンピューティング」の意味を説明してもらえますか? 私が理解している限りでは、クラウドコンピューティングはネットワークサービスモデルに近いため、物理ハードウェアを所有したり保守したりすることはありません。「クラウド」はすべてバックエンドのものです。しかし、その「クラウド」環境と通信するアプリケーションがまだあるかもしれません。そして、Webサイトを実行すると、ユーザーが入力するフォームを提示し、ページ上のボタンを押して、Webサーバーによって生成されたレポートを返します。これは「クラウド」コンピューティングと同じではありませんか?そして、あなたは私のウェブブラウザを「クライアント」と考えないでしょうか? 私の質問は、「クライアントサーバー」に関する「クラウドコンピューティング」の概念に固有のものです。 これがこのサイトの不適切な質問である場合は申し訳ありません。Stackユニバースに最も近いものであり、今回が初めてです。私は70年代後半のメインフレーム時代からプログラミングをしている古いタイマーです。

2
偽のウェイクアップの説明は、修正するだけの価値のないバグのように聞こえますが、そうですか?
スプリアスウェイクアップに関するウィキペディアの記事によると 「スレッドは、条件変数にシグナルを送っていなくても、待機状態から目覚めさせることができます」。 私はこの「機能」について知っていましたが、同じ記事で実際に何がそれを引き起こしたのかは知りませんでした 「スプリアスウェイクアップは奇妙に聞こえるかもしれませんが、一部のマルチプロセッサシステムでは、コンディションウェイクアップを完全に予測可能にすると、すべてのコンディション変数操作が大幅に遅くなる可能性があります。」 修正する価値のないバグのように聞こえますが、そうですか?

8
美しいコードとは何ですか?[閉まっている]
開発者は美しいコードを書かなければならないことをよく読みますが、初心者の私にとっては、美しいコードとは何か、どのようにそれを認識するのかわかりません。 当然の質問は、美しいコードを書く方法と、コードの品質を向上させるための実践的な習慣は何ですか?、私が書いたコードを美しくするために何を気にする必要がありますか(そして私が学ぶこと)。

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