ソフトウェア工学

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

4
単純なプロパティでAggressiveInliningを使用することには欠点がありますか?
C#/ JITがどのように動作するかを分析するためのツールについてもっと知っていれば、私は自分自身に答えることができるに違いないが、そうではないので、私に尋ねてください。 私はこのような簡単なコードを持っています: private SqlMetaData[] meta; [MethodImpl(MethodImplOptions.AggressiveInlining)] private SqlMetaData[] Meta { get { return this.meta; } } ご覧のとおり、AggressiveInliningをインライン化する必要があると感じたため、AggressiveInliningを配置しました。 おもう。それ以外の場合、JITがインライン化する保証はありません。私が間違っている? この種のことを行うと、パフォーマンス/安定性/何かが損なわれる可能性がありますか?

7
プログラマーがコードレビューを処理する最善の方法は何ですか?
私はコードレビューはかなり新しいですが、博士号を取得している間は何年もコーディングを行ってきました。 レビュアーがコードを変更し、1行ずつコードを検討する場合、同意しない場合はどうしますか?Xを選択し、レビュアーがそれをYに変更し、Yを思い浮かべていたが、デメリットのためにそれを行わないことに決めたことがありますが、レビュアーはこれらのデメリットは重要ではないと断言します。意見の不一致を言葉で表現するべきでしょうか、それともそうではなく、それらに耳を傾けるべきでしょうか? 批判を受け入れるのが苦手で、レビュアーが組織の上級者である場合は困難です。防御的すぎると出くわすのは良くありません。

2
純粋に審美的な理由で入れ子関数を作成しますか?
私は、純粋な美的機能を作成するというアイデアについて、他のプログラマーがどう考えているのか、いつも疑問に思っていました。 データのチャンクを処理する関数があるとしますFunction ProcessBigData。たとえば、そのデータにのみ有効ないくつかのプロセスステップが必要Step1だStep2としStep3ます。 ソースコードで最もよく見られる通常のアプローチは、次のようなコメントを書くことです。 Function ProcessBigData: # Does Step1 Step1.. Step1.. #Does Step2 Step2.. Step2.. 私はいつもやっていますが、仲間の仲間がそのようなコーディングスタイルを欠いているためにいつも間違っていると感じました: Function ProcessBigData: Function Step1: Step1.. Step1.. Function Step2: Step2.. Step2.. Step1() -> Step2() 私は主に、JavascriptとPythonでそのようなスタイルに欠点があるかどうかを心配しています 表示されない代替手段はありますか?

2
ScalaのTraitsは「ダイヤモンドエラー」をどのように回避しますか?
(注:明白な理由のためにタイトルで「問題」の代わりに「エラー」を使用しました。;))。 ScalaでTraitsの基本的な読書をしました。これらはJavaまたはC#のインターフェイスに似ていますが、メソッドのデフォルト実装を許可します。 私は不思議に思っていました:これは「ダイヤモンドの問題」のケースを引き起こすことはできません。それが多くの言語がそもそも多重継承を避ける理由です。 その場合、Scalaはこれをどのように処理しますか?

6
なぜプライベートメンバー関数をヘッダーに入れるのですか?
プライベートメンバー変数をC ++ヘッダーに配置する理由の答えは、コンパイラがスタック内を適切に移動するコードを生成できるように、インスタンスが宣言されたポイントでクラスのサイズを知る必要があるということです。 プライベートメンバーをヘッダーに配置する必要があるのはなぜですか? しかし、クラス定義でプライベート関数を宣言する理由はありますか? 代替案は、本質的にはくぼみのイディオムですが、余分な間接化はありません。 この言語機能は歴史的なエラー以上のものですか?
16 c++  history 

8
関数型プログラミングのためのメンタルモデルまたは実世界の比phor
現実世界の何かを参照する機能プログラミングの優れたメンタルモデルやメタファーを持っている人はいますか? オブジェクト指向プログラミングは直感的に理にかなっています。プロパティを持っているものがありますが、時にはプロパティを操作したり、プロパティ(メソッド)を計算したりすることもできます。(例:車、形、猫)。 私は関数型プログラミングに何の害もないし、2つの美徳についての議論には興味がありません。オブジェクト指向プログラミングと同じように、メタファーまたはメンタルモデルが必要です。 機能的パラダイムでプログラミングするための優れたメンタルモデルまたは現実世界のメタファーとは何ですか?機能を処理する機能で構成される機能については、立ち上がって発言するための確固たる場所がなくなります。

5
過剰なメソッドのオーバーロードを避ける方法は?
アプリケーションのソースコードには非常に多くの場所があり、1つのクラスには同じ名前で異なるパラメーターを持つ多くのメソッドがあります。これらのメソッドには、常に「前の」メソッドのすべてのパラメーターと1つ以上のパラメーターがあります。 それは長い進化(レガシーコード)とこの考え方の結果です(私は信じています): 「Aを実行するメソッドMがあります。A+ Bを実行する必要があります。わかりました。新しいパラメータをMに追加し、そのための新しいメソッドを作成し、Mから新しいメソッドにコードを移動します。 1つの以上のパラメータで、あそこA + Bを行うと、新しいパラメータのデフォルト値をMから新しいメソッドを呼び出します。」 以下に例を示します(Javaに似た言語): class DocumentHome { (...) public Document createDocument(String name) { // just calls another method with default value of its parameter return createDocument(name, -1); } public Document createDocument(String name, int minPagesCount) { // just calls another method with default value of its parameter …

5
重複する範囲を平坦化するアルゴリズム
重複する可能性のある数値範囲のリストを平坦化(分割)する良い方法を探しています。問題は、この質問の問題と非常に似ています。重複する日付範囲を分割する最も速い方法、および他の多くの方法です。 ただし、範囲は整数だけではなく、JavascriptやPythonなどで簡単に実装できる適切なアルゴリズムを探しています。 サンプルデータ: ソリューション例: これが重複している場合はおApびしますが、解決策はまだ見つかりません。

3
OOPの「抽象化」の定義について混乱している
OOPの「抽象化」の定義を理解しようとしています。 私はいくつかの主要な定義に出会いました。それらはすべて有効ですか?それらの1つは間違っていますか?よくわかりません。(定義を自分の言葉で書き直しました)。 定義1: 抽象化とは、現実世界からオブジェクトを取り出し、それをプログラミング用語に変換する概念です。そのような作成などのHumanクラスを、それを与えint health、int age、String name、などの性質、およびeat()等の方法。 定義2: より一般的な定義。抽象化は、「物事をより一般的/単純化/抽象化する」ことが関係するソフトウェアシステムのどこででも起こる概念です。いくつかの例: 継承階層。上位クラスがより単純またはより一般的であり、より一般的で抽象的な実装を定義します。階層の下位クラスはより具体的であり、より詳細な実装を定義します。 カプセル化を使用して、クラスの実装の詳細を他のクラスから隠すことにより、クラスを外部ソフトウェアの世界により「抽象化」(単純化)します。 定義3 別の一般的な定義:抽象化とは、物事の詳細や具体的な実装から、物事の種類(クラス)、利用可能な操作(メソッドなど)にフォーカスを移動する概念です。より抽象的な。(これは、ソフトウェアシステム内の任意のコンテキストで実行できます)。カプセル化は実装の詳細を隠し、物の種類とそれらのより一般的かつ抽象的な定義のみを表示することを意味するため、例えばカプセル化するときに行われます。Anotehrの例ではList、Javaでオブジェクトを使用します。このオブジェクトは実際にArrayListaまたはaの実装詳細を使用しますLinkedListが、この情報はより一般的な名前を使用して抽象化されListます。 これらの定義は正しいですか?(私は最も一般的で受け入れられている定義に言及しています)。

6
TDDの観点から、モックではなくライブエンドポイントに対してテストする場合、私は悪い人ですか?
私はTDDを宗教的に守ります。私のプロジェクトは通常、テストカバレッジが85%以上であり、意味のあるテストケースがあります。 私はHBaseで多くの作業を行っていますが、メインのクライアントインターフェイスであるHTableはモックの苦痛です。ライブエンドポイントを使用するテストを記述するよりも、ユニットテストを記述するのに3〜4倍時間がかかります。 哲学的に、モックを使用するテストは、ライブエンドポイントを使用するテストよりも優先されるべきであることを知っています。しかし、HTableのモックは深刻な痛みであり、実際のHBaseインスタンスに対するテストよりも多くの利点があるとは確信していません。 私のチームの全員がワークステーションでシングルノードHBaseインスタンスを実行し、JenkinsボックスでシングルノードHBaseインスタンスを実行しているため、可用性の問題はありません。ライブエンドポイントテストは、モックを使用するテストよりも明らかに実行に時間がかかりますが、実際には気にしません。 現在、すべてのクラスに対してライブエンドポイントテストと模擬ベースのテストを作成しています。モックを捨てたいのですが、結果として品質が低下するのは望ましくありません。 皆さんはどう思いますか?

2
ユニバーサル構造をより効率的にするにはどうすればよいですか?
「ユニバーサルコンストラクション」は、シーケンシャルオブジェクトの線形化を可能にするラッパークラスです(同時オブジェクトの強力な整合性条件)。たとえば、Javaでの[1]からの適応された待機なしの構築は次のとおりです。WFQこれは、インターフェイスを満たす(スレッド間の1回限りのコンセンサスを必要とする)待機なしキューの存在を前提とし、Sequentialインターフェイスを想定しています: public interface WFQ<T> // "FIFO" iteration { int enqueue(T t); // returns the sequence number of t Iterable<T> iterateUntil(int max); // iterates until sequence max } public interface Sequential { // Apply an invocation (method + arguments) // and get a response (return value + state) Response apply(Invocation i); …

4
アセンブリからマシンコードへの移行方法(コード生成)
コードを機械コードにアセンブルするステップを視覚化する簡単な方法はありますか? たとえば、メモ帳でバイナリファイルを開くと、マシンコードのテキスト形式の表現が表示されます。私はあなたが見る各バイト(シンボル)がそのバイナリ値に対応するASCII文字であると仮定しますか? しかし、アセンブリからバイナリにどのように移行するのでしょうか。舞台裏で何が起こっているのでしょうか??

2
外部ファイルから単体テストのデータをロードするかどうか
ユニットテストを行うとき、どのくらいの量のデータをフィードし、テスト対象のユニットから戻ってくるのかを議論することがよくあるので、実際のテストファイルに含める必要があります。 私が常に苦労しているトレードオフは: テストの大部分(コードボリューム内)が入力データと出力データで構成されている場合、実際にテストを読み取ることは困難に思えますが、実際の入出力を簡単に確認できます。 ファイルからテストデータを読み込むと、可能なデータ入力のバリエーションを簡単にテストでき、テストデータを複数のテストに簡単に再利用できますが、入力が正確に何であるかを確認するには、ソースコードを残しておく必要があります。 これらのいずれかがアンチパターンですか?

4
ネイティブマシンコードを簡単に逆コンパイルできないのはなぜですか?
Java、VB.NET、C#、ActionScript 3.0などのバイトコードベースの仮想マシン言語では、インターネットからデコンパイラーをダウンロードしてバイトコードを1回実行するだけの簡単さについて時々耳にします。多くの場合、数秒で元のソースコードからそれほど離れていないものを見つけます。おそらく、この種の言語はそれに対して特に脆弱です。 私は最近、ネイティブバイナリコードに関して、これが元々どの言語で書かれていたのか(したがって、どの言語に逆コンパイルしようとするのか)を少なくとも知っているのに、なぜこれについて聞いていないのだろうと思い始めました。長い間、ネイティブマシン言語が典型的なバイトコードよりも非常にクレイジーで複雑だからだと考えていました。 しかし、バイトコードはどのように見えますか?次のようになります。 1000: 2A 40 F0 14 1001: 2A 50 F1 27 1002: 4F 00 F0 F1 1003: C9 00 00 F2 そして、ネイティブマシンコードは(16進数で)どのように見えますか?もちろん、次のようになります。 1000: 2A 40 F0 14 1001: 2A 50 F1 27 1002: 4F 00 F0 F1 1003: C9 00 00 F2 そして、指示はやや似たような心構えから来ています。 1000: mov EAX, 20 …

4
iterableとenumerableに違いはありますか?
多くの言語には、反復可能または列挙可能と呼ばれる非常に類似した構造があるようです。これらは反復または列挙できる構造であり、非常に似ているように思えます。これらの単語は同義語ですか、用語の選択を正当化するiterableとenumerableの間に微妙な意味の違いがありますか?

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