ソフトウェア工学

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

2
ヒップホップ仮想マシン(HHVM)は、理論的にどのようにPHPランタイムのパフォーマンスを向上させますか?
高いレベルから、Facebookなどはどうですか。Hip Hop仮想マシンでPHPのパフォーマンスを向上させるために使用しますか? 従来のzendエンジンを使用してコードを実行するのとどう違うのですか?これは、型がオプションで事前最適化手法を可能にするハックで定義されているためですか? 私の好奇心は、HHVMの採用というこの記事を読んだ後で生じました。

8
Cがコンパイル/解釈/ JITされるのを妨げる原因は何ですか?
Javaは、その驚くべき移植性でしばしば賞賛されています。これは、JVMが原因だと思います。私の質問は、Cがコンパイル/解釈/ JITされるのを阻止するものです。もしそうなら、Cは1度だけ記述して、あなたが持っているどのデバイスでも動作させることができます。しかし、これはCプログラムを処理するための一般的なメカニズムではありません。 もちろん、このようにCを処理することの欠点は何ですか?もちろん移植性以外に、このようにJavaを処理してマシンコードにコンパイルしないことの利点は何ですか?

3
型ベースの不変条件に対する関数型プログラミングの答えは何ですか?
不変条件の概念が複数のプログラミングパラダイムに存在することを知っています。たとえば、ループ不変式は、オブジェクト指向プログラミング、関数型プログラミング、手続き型プログラミングに関連しています。 ただし、OOPにある非常に便利な種類の1つは、特定のタイプのデータの不変条件です。これをタイトルで「型ベースの不変条件」と呼んでいます。たとえば、Fractionタイプが持つかもしれないnumeratorし、denominatorそのGCDは常に1であることを不変で、(すなわち画分が減少した形です)。これを保証できるのは、そのタイプを何らかのカプセル化して、データを自由に設定できないようにすることだけです。その見返りに、削減されているかどうかを確認する必要がないので、等価性チェックなどのアルゴリズムを簡略化できます。 一方、Fractionカプセル化によってこの保証を提供せずに単純に型を宣言した場合、将来、他の誰かがやって来て方法を追加する可能性があるため、分数が減ると仮定してこの型の関数を安全に書くことはできません非還元分数を取得する方法。 一般に、この種の不変条件がないと、次のような結果になる可能性があります。 前提条件を複数の場所でチェック/保証する必要があるため、より複雑なアルゴリズム これらの繰り返される事前条件は同じ根本的な知識を表すため、DRY違反(不変条件が真であること) コンパイル時の保証ではなく、実行時の失敗を通じて事前条件を適用する必要がある だから私の質問は、この種の不変条件に対する関数型プログラミングの答えは何かということです。ほぼ同じことを達成するための機能的慣用的な方法はありますか?または、利点をあまり関連性のないものにする関数型プログラミングの側面はありますか?

5
Javaの「インターフェイスへのプログラム」は常に意味がありますか?
インターフェイスから実装するクラスがどのようにインスタンス化されるかに関するこの質問での議論を見てきました。私の場合、私はのインスタンスを使用するJavaで非常に小さなプログラムを書いており、TreeMapそこでの皆の意見によると、次のようにインスタンス化する必要があります。 Map<X> map = new TreeMap<X>(); 私のプログラムでmap.pollFirstEntry()は、Mapインターフェイスで宣言されていない関数(およびMapインターフェイスにも存在する他のカップル)を呼び出しています。私はTreeMap<X>次のようにこのメソッドを呼び出すすべての場所にキャストすることでこれを行うことができました: someEntry = ((TreeMap<X>) map).pollFirstEntry(); 上記の初期化ガイドラインの利点を大規模プログラムで理解していますが、このオブジェクトが他のメソッドに渡されない非常に小規模なプログラムの場合は、不要だと思います。それでも、私はこのサンプルコードを求人アプリケーションの一部として書いており、コードの見栄えを悪くしたり、散らかしたりしたくありません。最もエレガントなソリューションは何でしょうか? 編集:私は、特定の関数を適用するよりも、広く適切なコーディング方法に関心があることを指摘しておきますTreeMap。一部の回答は既に指摘されている(そして、最初に回答したものとしてマークした)ため、機能を失うことなく、可能な限り高い抽象化レベルを使用する必要があります。

4
階層を強制せずに、オブジェクトを相互に作用させて通信するにはどうすればよいですか?
これらのとりとめのない質問で私の質問が明確になることを願っています。ただし、そうでない場合は完全に理解できます。その場合はその旨をお知らせください。さらに明確にしていきます。 オブジェクト指向のゲーム開発に精通するために私が作成した非常に単純なゲームであるBoxPongに出会ってください。ボックスをドラッグしてボールを操作し、黄色い物を集めます。 BoxPongを作成することは、とりわけ、基本的な質問の策定に役立ちました。互いに「所属する」必要なしに、互いに対話するオブジェクトをどのようにして持つことができますか?言い換えれば、オブジェクトが階層的ではなく、代わりに共存する方法はありますか?(以下でさらに詳しく説明します。) オブジェクトの共存の問題はよくある問題だと思うので、解決する確立された方法があるといいのですが。私は四角いホイールを作り直したくないので、私が探している理想的な答えは「ここに、あなたの種類の問題を解決するために一般的に使用される設計パターンがある」と思います。 特にBoxPongのような単純なゲームでは、同じレベルで少数のオブジェクトが共存している、または共存している必要があることは明らかです。箱があり、ボールがあり、収集品があります。オブジェクト指向言語で表現できるのは、厳密なHAS-A関係だけですが、そうです。これは、メンバー変数を介して行われます。私は単に始めてballそれを実行させるだけではなく、永久に別のオブジェクトに属している必要があります。メインのゲームオブジェクトは、そのので、私はそれを設定した持っているボックスを、ひいてはボックスがありたボールを、そして持っているスコアカウンターを。各オブジェクトには、update()位置、方向などを計算するメソッドと同じように移動します。メインのゲームオブジェクトのupdateメソッドを呼び出します。このメソッドは、すべての子のupdateメソッドを呼び出し、次に、すべての子のupdateメソッドを呼び出します。これがオブジェクト指向のゲームを作るために私が見ることができる唯一の方法ですが、それは理想的な方法ではないと感じています。結局のところ、私はボールをボックスに属していると正確に考えるのではなく、同じレベルにいて、それと相互作用していると考えています。これは、すべてのゲームオブジェクトをメインゲームオブジェクトのメンバー変数に変換することで実現できると思いますが、何も解決しないと思います。つまり...明らかな混乱をさけて、ボールとボックスがどのようにしてがお互い知る、つまり相互作用か? また、オブジェクト間で情報を渡す必要があるという問題もあります。私はSNESのコードを書くのにかなりの経験があります。そこでは、実質的に常にRAM全体にアクセスできます。スーパーマリオワールドのカスタム敵を作成していて、マリオのコインをすべて削除して、ゼロを格納して$ 0DBFに対処したいとします。問題ありません。敵がプレイヤーのステータスにアクセスできないという制限はありません。C ++などでは、他のオブジェクト(またはグローバル)から値にアクセスできるようにする方法に疑問を感じることが多いので、私はこの自由に甘やかされていると思います。 BoxPongの例を使用して、ボールが画面の端から跳ね返るようにしたい場合はどうなりますか?widthそして、heightのプロパティであるGameクラスは、ballそれらにアクセスできるようにします。これらの種類の値を(コンストラクターまたは必要なメソッドを介して)渡すこともできますが、それは私にとって悪い習慣であるだけです。 私の主な問題は、お互いを知るためにオブジェクトが必要であるということですが、それを行うために私が見ることができる唯一の方法は、厳密な階層であり、これは醜く非実用的です。 私はC ++の「友達クラス」について聞いたことがありますが、それらがどのように機能するかは知っていますが、それらが最終的な解決策である場合、どうして表示されないのですか friendすべてのC ++プロジェクト全体にキーワードが注がれて概念はすべてのOOP言語に存在するわけではありませんか?(私が最近学んだばかりの関数ポインターについても同じことが言えます。) あらゆる種類の回答を事前にありがとう—そして、あなたに意味をなさない部分があれば、私に知らせてください。

2
例外クラスの設計
小さなライブラリをコーディングしていますが、例外処理の設計に問題があります。私はC ++言語のこの機能に(まだ)混乱していると言わざるを得ません。例外クラスを適切に処理するために何をしなければならないかを理解するために、この件について可能な限り読んでみました。 クラスのsystem_errorSTL実装からインスピレーションを得たタイプのアプローチを使用することにしましたfuture_error。 エラーコードを含む列挙があります: enum class my_errc : int { error_x = 100, error_z = 101, error_y = 102 }; そして、単一の例外クラス(error_category構造のタイプとsystem_errorモデルが必要とする他のすべてによってバックアップされます): // error category implementation class my_error_category_impl : public std::error_category { const char* name () const noexcept override { return "my_lib"; } std::string message (int ec) const override { std::string …

1
「フラックス」と純粋な関数型反応プログラミングの間にはどのような関係がありますか?
Fluxは、私が理解している限り、アプリケーションのデータフローを一方向で処理し、状態をプログラムの残りの部分から分離した、読み取り専用の自己完結型の「ストア」で維持する手法です。ビューによって発行され、ディスパッチャーによってディスパッチされる「アクション」。または、要するに-状態を制御する方法。 それが正しい場合、関数型反応型プログラミングとどのように相関しますか?FRPは状態を非常に強力に制御するため、これらは実際に同じ問題を解決する相互に排他的な手法だと思います。したがって、FRPライブラリ(Elmなど)を使用する場合、Fluxはほとんど使用されません。これは正しいです?

3
COMの制限を考慮して.NETライブラリを作成するか、.NETライブラリを相互運用から分離する方が良いですか
私はこの興味深い記事に出くわしました:CodeProjectでのCOM相互運用性が好きになりました。 著者は、.NETライブラリの美しさを損なうため、.NETライブラリにCOM-ityを必要としないと主張しています。代わりに、.NETライブラリをCOMに公開する個別の相互運用ライブラリを作成します。この相互運用ライブラリは、COMがパラメーター、オーバーロードメソッド、ジェネリックス、継承、静的メソッドなどのコンストラクターをサポートしていないという事実を処理します。 そして、それは非常に斬新なことだと思いますが、それだけでプロジェクトを完成させるのではないですか? 次に、.NETライブラリとInteropライブラリを単体テストする必要があります。 次に、美しい.NETライブラリを回避してCOMに公開する方法を理解するために時間を費やす必要があります。 クラス数を効果的に2倍または3倍にする必要があります。 COMと非COMの両方をサポートするためにライブラリが必要かどうかは確かに理解できます。ただし、COMのみを使用する場合、この種の設計は私には見られない利点をもたらしますか?C#言語の利点しか得られませんか? または、ラッパーを提供することでライブラリのバージョン管理を容易にしますか?COMを使用する必要がないため、単体テストの実行が速くなりますか?

4
このシナリオでは訪問者パターンは有効ですか?
私のタスクの目標は、スケジュールされた繰り返しタスクを実行できる小さなシステムを設計することです。定期的なタスクとは、「月曜日から金曜日の午前8時から午後5時まで、毎時間管理者にメールを送信する」のようなものです。 RecurringTaskという基本クラスがあります。 public abstract class RecurringTask{ // I've already figured out this part public bool isOccuring(DateTime dateTime){ // implementation } // run the task public abstract void Run(){ } } また、RecurringTaskから継承されたクラスがいくつかあります。それらの1つはSendEmailTaskと呼ばれます。 public class SendEmailTask : RecurringTask{ private Email email; public SendEmailTask(Email email){ this.email = email; } public override void Run(){ …

1
2つのデータウェアハウスへのデータアクセスを加速する最良の方法は?
2つの既存のデータウェアハウスへのアクセスを抽象化する必要があるビジネスインテリジェンスプロジェクトに着手しています。セルフサービスのビジネスインテリジェンスがデータを結合し、2つの既存の倉庫の単一のビューを提供できるように、アプリケーションアーキテクチャを設計する必要があります。私はこのようなものを考え出しました: 私は仮想化/キャッシングの部分に苦労しており、私の問題を解決するためのエンタープライズ設計パターンがあるかどうか疑問に思っています。このようなアーキテクチャは、データウェアハウスのスタースキーマを抽象化するのに役立ちますか?Red Hat JBoss Data VirtualizationやRed Hat JBoss Data Gridなどの製品を探しています。 現在Hibernateを使用しておらず、データグリッドについての私の理解は、それらがキー値ストアまたはオブジェクトストアであるため、リレーショナルモデルのキャッシュには適していません。また、セルフサービスダッシュボードパーツにはベンダー製品を使用したいと考えていますが、ベンダーが必要なすべてを提供できない場合は、この領域でカスタムビルドを実行する可能性があります。

3
非常に古い学校のアプローチに戻って、マイクロサービスで一周しましたか?
ソフトウェアのアーキテクチャと設計の観点から、マイクロサービスはミドルウェアに対してどのように「積み上げ」られますか(意図されていません)私はJavaから来ています。APIとしてのまっすぐなRESTから離れ、少なくともJavaでさまざまなレイヤーと接続パラメーターを抽象化すると、非常に古い学校のアイデアにほぼ完全に戻ってきたようです。仮想化に戻りました... JVMがすでに仮想化されているかどうか。 不可知論的な方法で、RESTful APIをCORBAに抽象化することができ、その利点を主張します。または、よりJava中心の方法で、JMSまたはMDB。 かつて、EJBはJavaで大きな問題でしたが、それがクラスター効果の一部であると認識されていましたが、今、最初に戻りましたか? または、マイクロサービスは、CORBA、またはさらに優れたMDBにはないものを提供しますか?マイクロサービスの説明(TLDR)Martin Fowlerを読んだとき、もしそうなら、それは悪い問題の良い解決策として私を驚かせます。むしろ、問題を押し広げるだけの複雑さのレベルをもたらすクローズドマインドアプローチ。サービスが本当にマイクロで数が多い場合、それぞれのサービスの実行と維持に1ドルのコストがかかります。 さらに、多くの中で1つのマイクロサービスがそのAPIを変更すると、そのサービスに依存するすべてが壊れます。それはしないように見えるそれは、疎結合思わアジャイルの反対を。それとも私はそれらの言葉を誤用していますか? もちろん、これらの両極端の間には不確定な量の選択肢があります。 サメ対ゴリラ...行く! (知識を深めるために、それは皮肉なことを意味し、私の意図ではありません。質問は額面通りに受け取られることを意味します。質問を改善できる場合は、そうするか、コメントしてください。修正します。 ) Dockerで実行されている多数のマイクロサービスがすべて1台のマシンで実行され、互いに対話していることを想像してください...狂気。保守や管理が難しく、変更を重ねると予期しないエラーが発生するため、何も変更することはほとんど不可能です。これらのサービスが異なるマシンに分散していることはどういうわけですか?そして、それらが分散されている場合、確かに、非常に古くからあるいくつかの手法が、少なくともある程度、分散コンピューティングを解決しています。 なぜ水平スケーリングが普及しているか、少なくとも望ましいのですか?

3
データ型のインターフェースの使用はアンチパターンですか?
モデルに(EFを使用して)さまざまなエンティティがあるとします(ユーザー、製品、請求書、注文など)。 エンティティが事前に決定されたセットに属しているアプリケーションでエンティティオブジェクトの要約を印刷できるユーザーコントロールを作成しています。この場合、ユーザーと製品の要約を要約できると言います。 要約にはすべてIDと説明しか含まれないため、このための簡単なインターフェースを作成します。 public interface ISummarizableEntity { public string ID { get; } public string Description { get; } } 次に、問題のエンティティについて、このインターフェイスを実装する部分クラスを作成します。 public partial class User : ISummarizableEntity { public string ID { get{ return UserID.ToString(); } } public string Description { get{ return String.Format("{0} {1} is from {2} and is …

2
リンクされたリストからアイテムを削除する正しい方法
このスラッシュドットのインタビューで、 Linus Torvaldsは次のように語っています。 "prev"エントリを追跡して片方向リンクリストエントリを削除し、そのエントリを削除する人が多すぎます。 if(prev) prev-> next = entry-> next; else list_head = entry-> next; そして、そのようなコードを見るときはいつでも、「この人はポインタを理解していません」とだけ行きます。悲しいことに、それはかなり一般的です。 ポインタを理解している人は、「エントリポインタへのポインタ」を使用して、list_headのアドレスで初期化します。そして、リストをトラバースするときに、「* pp = entry-> next」を実行するだけで、条件を使用せずにエントリを削除できます。 PHP開発者として、私は10年前の大学でのC入門以来ポインタに触れていません。でも、これは少なくとも知っておくべき状況だと思います。Linusは何について話しているのですか?正直なところ、リンクされたリストを実装してアイテムを削除するように求められた場合、上記の「間違った」方法は私がそれについて取り組む方法です。Linusが最もよく言うように、コーディングするために何を知る必要がありますか? 私は実際に本番コードでこれに問題を抱えていないので、スタックオーバーフローではなく、ここで質問します。
9 pointers 

3
文字列の数、各文字が偶数回出現する必要がある場合
私はしばらくの間、この問題に頭蓋骨をぶつけてきましたが、それは本当に私を苛立たせ始めています。問題は: 私は、文字のセットを持ってA、B、C、とD。長さがnあり、各文字が偶数回出現する必要がある場合、これらの文字から文字列を構築する方法をいくつも教えなければなりません。 たとえば、の答えn = 2は4です。 AA BB CC DD の答えn = 4は40です。これらの有効な文字列の一部は次のとおりです。 AAAA AABB CACA DAAD BCCB 私は論理を思いつくのに行き詰まっています。このためのDPソリューションがあると思います。これを介して私の方法を総当たり的にすることは問題外です:ソリューションの数は急速に膨大な数に成長します。 私はあらゆる種類のアイデアを紙に描いてみましたが、役に立ちませんでした。それらのほとんどすべては、それらの複雑さが大きすぎるために破棄しなければなりませんでした。ソリューションは、に対して効率的である必要がありますn = 10^4。 私のアイデアの1つは、実際の文字列を追跡するのではなく、各文字が偶数回または奇数回出現したかどうかを追跡することでした。このロジックを適用する方法を思いつきませんでした。 誰か助けてもらえますか?

1
WebGLRenderingContextについてWebStormのオートコンプリートに通知する方法
私はWebGLを含むプロジェクトに取り組んでおり、WebStormを使用して開発を行っています。 開発フローの1つの問題は、WebStormがWebGLに関連するものを自動補完できないことです。特に、値をタイプであるとして注釈を付けるとWebGLRenderingContext /** @type {!WebGLRenderingContext} */ var gl; WebStormは、WebGLRenderingContextが未解決の変数であると文句を言います。また、でのメソッドの使用について不満を述べgl、それらのメソッドが見つからないために存在しない可能性があることを警告します。 私の現在の回避策(警告をオフにするだけでなく)は、次のようにレコードタイプを指定することです。 * @type {{ * texParameteri: function, * TEXTURE_WRAP_T: *, * ... * }} var gl; しかし、レンダリングコンテキストを使用するたびに、このような数十および数十の標準化されたメンバーを個人的にリストするのは、少しばかげています。もっと簡単な方法はありますか?
9 webgl 

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