ソフトウェア工学

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

1
「構文酢」とはどういう意味ですか
Groovy in Action、第2版を読んでいて、脚注で次のテキストを見つけました Javaは、プログラマーがそれを使用するのを思いとどまらせるために、そのような構成体に「構文酢」をかけます。 syntax vinegarここでいう用語の意味は? この用語を聞いたことがなく、DuckDuckGoとGoogleで検索しましたが、意味が見つかりませんでした。しかし、それは複数の場所で使用されています。誰かがこの用語の意味と、それがプログラミング言語の文脈でどのように適用されるかを明確にできれば素晴らしいと思います。これが有効な質問となることを願っています。私がこれを尋ねることができる他のstackexchangeサイトを見つけることができませんでした。
12 java  syntax  groovy 

1
セマフォがセマフォと呼ばれるのはなぜですか?
鉄道セマフォは、旗や信号のような他の一般的な信号オブジェクトよりもセマフォをよく説明しているように思えません。キーリングのようなもの(ロックされたリソースにアクセスするためにリングからキーを外し、終了したらそれらを返す)は、より説明的です。では、なぜセマフォはセマフォと呼ばれるのですか?
12 semaphore 

3
ライブラリの可視性を処理する一般的な方法は何ですか?
クラスでprivateを使用するタイミングとprotectedを使用するタイミングに関するこの質問に、私は考えました。(この質問は関連しているため、最終クラスとメソッドにも拡張します。Javaでプログラミングしていますが、これはすべてのOOP言語に関連すると思います) 受け入れられた答えは次のとおりです。 良い経験則は、すべてをできるだけプライベートにすることです。 そしてもう一つ: すぐにサブクラス化する必要がない限り、すべてのクラスを最終クラスにします。 サブクラス化してすぐにオーバーライドする必要がない限り、すべてのメソッドをfinalにしてください。 メソッドの本体内で変更する必要がある場合を除き、すべてのメソッドパラメーターを最終的なものにします。 これは非常に単純明快ですが、アプリケーションではなく主にライブラリ(GitHubのオープンソース)を書いている場合はどうでしょうか。 多くのライブラリとシチュエーションに名前を付けることができます。 開発者が考えもしなかった方法でライブラリが拡張されました これは、可視性の制約のため、「クラスローダーマジック」およびその他のハックを使用して行う必要がありました。 ライブラリは構築されていない方法で使用され、必要な機能は「ハッキング」されました 可視性の低下により変更できない小さな問題(バグ、機能の欠落、「間違った」動作)のため、ライブラリを使用できませんでした 修正できなかった問題は、単純な関数(プライベートまたは最終)をオーバーライドするのに役立つ巨大でhugeいバグのある回避策につながりました。 そして、質問が長くなりすぎるまでこれらの名前を付け始め、それらを削除することにしました。 必要以上のコード、必要以上の可視性、必要以上の抽象化を持たないというアイデアが好きです。そして、これはエンドユーザー向けのアプリケーションを書くときに機能するかもしれません。その場合、コードはそれを書く人だけが使用します。しかし、コードが他の開発者によって使用されることを意図している場合、これはどのように持続しますか?元の開発者があらゆる可能なユースケースを事前に考え、変更/リファクタリングが困難/不可能である可能性は低いですか? 大きなオープンソースライブラリは新しいものではないので、オブジェクト指向言語を使用したこのようなプロジェクトで可視性を処理する最も一般的な方法は何ですか?

5
計算に使用するコアの数 #coresまたは#cores -1?
私はやるべき大きな計算があります。すべてのコアを使用できますが、1つのコアを使用せずに使用しない理由はありますか?(計算CPUはIOなしのみ)。または、すべてのコアを利用しても、適切なコンテキストスイッチングを処理および実行することを知らないOSを過小評価していますか?

1
複数のマイクロサービスにまたがるデータ全体の検索
特定のドメインのデータをマイクロサービスとレガシーデータベースの間で分散しています。レガシーデータベースとマイクロサービスデータベースの両方のフィールドにまたがる検索があります。以前(マイクロサービスの分割前)、1つのSQLクエリで実行されていました。この検索機能を提供するには、REST呼び出しとレガシーデータベースへのクエリが必要です。ここでは数百万行について話しています。これをどのように最適にモデル化できますか?データ量が多いため、REST呼び出しは通常、ページ分割された結果も返します。SQL呼び出しを起動し、結果をREST応答と結合およびマージする単純なアプローチは遅すぎて、実際的ではありません。

2
Javacのようなコンパイラは、純粋な関数を自動的に検出して並列化しますか?
純粋な関数は、並列化を容易にすることが知られています。 本質的に並列実行に適応させる関数型プログラミングについてはどうですか? Javacなどのコンパイラは、メソッドが純粋な関数であるかどうかを検出するのに十分スマートですか?Functionなどの機能インターフェイスを実装するクラスを常に実装できますが、副作用があります。

5
複雑な処理を伴うアプリケーションにアジャイルをどのように適用できますか?
アジャイルに関する文献のほとんどは、ユーザーが舞台裏で何が起こっているかをかなり認識しているCRUDタイプのビジネスアプリケーションに偏っているようです。(書かれているコードのほとんどはおそらくこのクラスに属しているため、それは問題ありません。) このタイプのアプリケーションでは、ユーザーストーリー(要件)と開発タスクの関係はほとんど単純です。ユーザーストーリーをいくつかのタスクに分割するだけです。 しかし、ほとんどのコードがユーザーに直接見えない複雑な処理を処理しなければならない別のタイプのアプリケーションがあります。例は次のとおりです。 コンパイラー 自動運転車の画像解析システム 流体シミュレーションシステム ここでは、タスクとユーザーストーリーを関連付けるのが非常に難しくなる可能性があります。この問題を克服するためのテクニックはありますか、それを受け入れてそれを最大限に活用しなければならないのでしょうか?

2
ファイルシステムは、ストレージデバイスを(非常に大きな)バイト配列として「認識」しますか?
ファイルシステムがストレージデバイスにどのように読み書きするかを知りたい。 私はこれがどのように機能するかと思います: ファイルシステムはストレージデバイスに直接アクセスしませんが、ストレージデバイスは(ストレージデバイスのデバイスドライバーによって)(非常に大きな)バイト配列としてファイルシステムに提示されます。 たとえば、ファイルシステムがハードディスクにアクセスする場合、ハードディスクを表すバイト配列にアクセスします。 このように、ファイルシステムはあらゆる種類のストレージデバイス(従来のハードディスク、SSD、USBフラッシュドライブなど)で動作でき、ストレージデバイスのデバイスドライバーのみが変更されます。 この画像は、私が今説明したことを示しています。 私の理解は正しいですか?

4
関数型スタイルでプログラミングする場合、アプリケーションロジックを通して織り込む単一のアプリケーション状態がありますか?
どのように私は、次のすべてを持っているシステムを構築します。 不変オブジェクトで純粋な関数を使用します。 関数が必要とする関数データのみに渡し、それ以上(つまり、大きなアプリケーション状態オブジェクトはなし) 関数への引数が多すぎることは避けてください。 関数に渡されるパラメーターが多すぎるのを避けるために、関数にパラメーターをパックおよびアンパックするためだけに新しいオブジェクトを作成する必要はありません。複数のアイテムを単一のオブジェクトとして関数にパックする場合、一時的に構築されたものではなく、そのオブジェクトをそのデータの所有者にしたい Stateモナドはルール2に違反しているように思えますが、モナドを介して織り込まれているため明らかではありません。 どういうわけかレンズを使用する必要があると感じていますが、非機能言語についてはほとんど書かれていません。 バックグラウンド 演習として、既存のアプリケーションの1つをオブジェクト指向スタイルから機能スタイルに変換しています。私が最初にやろうとしているのは、アプリケーションの内部コアをできるだけ多く作成することです。 私が聞いたことの1つは、純粋に機能的な言語で「状態」を管理する方法であり、これは私がステートモナドによって行われていると信じていることです。 「そのままの世界」を選択し、関数が戻ると、変化した世界の状態を返します。 たとえば、純粋に機能的な方法で「hello world」を実行する方法は、プログラムに画面の状態を渡し、「hello world」が印刷された画面の状態を受け取るようなものです。技術的には、純粋な関数を呼び出しているので、副作用はありません。 それに基づいて、アプリケーションを調べました。1。最初に、すべてのアプリケーション状態を単一のグローバルオブジェクト(GameState)に入れます。2。次に、GameStateを不変にしました。変更することはできません。変更が必要な場合は、新しいものを作成する必要があります。これを行うために、コピーコンストラクターを追加しました。オプションで、変更された1つ以上のフィールドを使用します。3.各アプリケーションに、GameStateをパラメーターとして渡します。関数内で、予定通りの処理を行った後、新しいGameStateを作成して返します。 純粋に機能的なコアと、そのGameStateをアプリケーションのメインワークフローループにフィードする外側のループの仕組み。 私の質問: さて、私の問題は、GameStateには約15種類の不変オブジェクトがあることです。最下位レベルの関数の多くは、スコアの保持など、これらのオブジェクトの一部のみで動作します。それで、スコアを計算する関数があるとしましょう。今日、GameStateはこの関数に渡され、新しいスコアで新しいGameStateを作成してスコアを変更します。 それについて何かが間違っているようです。この関数はGameState全体を必要としません。スコアオブジェクトが必要です。そこで、スコアを渡すように更新し、スコアのみを返します。 それは理にかなっているように思えたので、私は他の機能をさらに使いました。一部の関数では、GameStateから2、3、または4つのパラメーターを渡す必要がありますが、アプリケーションの外側のコア全体でパターンを使用しているため、ますます多くのアプリケーション状態を渡しています。たとえば、ワークフローループの先頭で、メソッドを呼び出し、メソッドを呼び出すメソッドなどを呼び出して、スコアが計算されるまで続けます。つまり、一番下の関数がスコアを計算するという理由だけで、現在のスコアがこれらすべてのレイヤーに渡されます。 だから今私は時々数十のパラメータを持つ関数を持っています。これらのパラメーターをオブジェクトに入れてパラメーターの数を減らすこともできますが、そのクラスは、単に渡すことを避けるために呼び出し時に単純に構築されるオブジェクトではなく、状態アプリケーション状態のマスターの場所にしたいです複数のパラメータで、それらを解凍します。 だから今、私が持っている問題は私の関数があまりにも深くネストされていることだろうかと思っています。これは小さな関数が必要なためです。そのため、関数が大きくなったらリファクタリングし、複数の小さな関数に分割します。しかし、そうすることでより深い階層が生成され、外部関数が直接それらのオブジェクトを操作していない場合でも、内部関数に渡されたものはすべて外部関数に渡される必要があります。 この問題を回避する方法に沿って単にGameStateを渡すように見えました。しかし、関数が必要とする以上の情報を関数に渡すという元の問題に戻りました。

2
ミューテックス実装のテストとベンチマークの方法
タイトルにあるように、C ++のmutexのさまざまな実装を適切にテストおよびベンチマークするにはどうすればよいですか? 基本的に、2つのコアarmv7で実行されるプロジェクトのstd :: mutexのようなクラスを作成し、競合しない場合のオーバーヘッドを最小限に抑えました。今、私は上記のミューテックスをより多くの場所と異なるアーキテクチャで使用することを検討していますが、これを行う前に、 それは実際に正しいです 標準のstd :: mutexよりもパフォーマンスが悪い病理学的なケースはありません。 明らかに、いくつかの基本的な単体テストとマイクロベンチマークを書いたので、すべてがうまくいくように見えますが、マルチスレッドコードでは「動作しているように見える」ので、それほど快適ではありません。 それで、確立された静的または動的分析技術はありますか? ミューテックスクラスの単体テストを記述する際の一般的な落とし穴は何ですか? 注目すべき典型的なエッジケースは何ですか? 実装には標準ライブラリタイプのみを使用します。これには、アトミックでの非一貫性のロードおよびストア操作が含まれます。ただし、他の実装にも同じテストハーネスを使用したいので、主に実装に依存しないアドバイスに興味があります。
12 c++  testing  mutex 

3
階層データ用のフラットまたはネストされたJSON?
既に5回前後に切り替えました。このRESTエンドポイントは/api/tags/内部で使用するものであり(サードパーティのクライアントはありません)、私がそれを使用しているのは私だけです。 私はこれらの2つの表現の間で決定しています: 平らな { "types":[ { "id":1, "text":"Utility" }, { "id":7, "text":"Lease Terms" }, ], "tags":[ { "id":8, "text":"Water", "type":1 }, { "id":9, "text":"Electricity", "type":1 }, { "id":5, "text":"Minimum 12 month lease", "type":7 }, { "id":17, "text":"lease negotiable/flexible", "type":7 }, ] } ややモジュール化されています。互換性を損なうことなく、「国」などの別の最上位レイヤーを追加できます。 入れ子 { "1":{ "text":"Utility", "tags":{ "8":{ "text":"Water" …
12 rest  api-design  json 

2
オブジェクト指向設計で何をする必要があるかを実際に調べる方法は?
最初の免責事項:この質問がこのウェブサイトに適合するかどうかはわかりませんが、私だけでなく、初心者である他の人にとっても関連する質問であることに変わりはありません。ここに収まるように質問を改善できる場合は、intコメントを指摘してください。それが合わない場合は、私にも知らせてください。可能であれば、これに関する良いフォーラムが見つからなかったので、これについて議論できる場所を教えてください。 私はPHPを勉強した2009年にプログラミングを学びました。2012年の後半に、C#と.NETに移行しました。とにかく、コーディングは問題ではなく、アルゴリズムを書き留めることは私の問題ではありません。私の実際の問題は、要件を達成するために何をコーディングする必要があるか、どこでコーディングする必要があるかを知ることです。 Web上で利用できるそこにほとんどのコースは対処方法ここでは私のポイントではないなど、いくつかのAPIセットを使用する方法、特定の言語でコードを書く方法を- 。 ここ数年、オブジェクト指向の分析と設計、設計パターン、ドメイン駆動設計など、たくさんのことを読みました。たとえば、SOLIDの原則、ドメインエキスパートの関与の必要性、ユビキタス言語の開発など、DDDの主要なアイデアのいくつかを理解しています。少なくとも理にかなった理論的背景があると思います。 しかし、それが練習になると、私は災害だと感じます。しばらく前に、私はすでに他の誰かによって開発されていた金融システムの開発を続ける必要がありました。それは、C#とWinFormsで開発されたそのような「古いシステム」です。実際のドメインの複雑さ、多くのビジネスルールなどを含むプロジェクトを選んだのは初めてでした。 ほとんどの場合、要件を受け取ったとき、「一体どうやってこれを行うことができるのか」と思います。-どうすればよいのかを理解するために、要件の作業を開始する方法すらわからない。私が信じている主な混乱は、私がコーディングしなければならないもの、クラス、インターフェース、そして各ロジックがどこに行くのか、各クラスがどのクラスにあるべきなのかです。問題は、どこから始めればいいかわからないことです。 ほとんどの場合、非常に多くの考えでいくつかのアイデアになりますが、私のアイデアが正しいかどうかを判断する方法がわかりません。 推奨されたソフトウェアアーキテクチャとオブジェクト指向に関する多くのことを読んだと言ったので、これは理論の欠如ではないと思いますが、実際には何をしなければならないかを特定するのにはあまり役立ちませんでした。 それでは、どうすればオブジェクト指向設計を実際に 行うことができますか?私が学びたいのは、与えられた要件は、何をすべきか、各コードがどこに属しているかを見つけるプロセスでそれらに取り組む方法を知っていることです。自分の考えが正しいかどうかを判断する方法を学ぶにはどうすればよいですか? ここで答えとしてこれを完全に説明することは不可能だと思います。しかし、私が探しているのは、サイトのスタイルに応じて、単に概要を示し、アイデアを拡大し、これらのことを実際に学習するために使用できる参照(書籍、オンラインコースなど)を示す回答です。

4
「グループ化」列挙型にフラグを使用するのは間違っていますか?
私の理解では、[Flag]enumは通常、個々の値が相互に排他的でない組み合わせ可能なものに使用されるということです。 例えば: [Flags] public enum SomeAttributes { Foo = 1 << 0, Bar = 1 << 1, Baz = 1 << 2, } どこにどんなSomeAttributes値がの組み合わせとすることができるFoo、BarとBaz。 より複雑で実際のシナリオでは、列挙型を使用して以下を記述しDeclarationTypeます。 [Flags] public enum DeclarationType { Project = 1 << 0, Module = 1 << 1, ProceduralModule = 1 << 2 | Module, ClassModule = 1 …
12 c#  .net  readability  enum 

1
monorepoの一部を共有する
現在、多くのSVNおよびGitリポジトリ(それぞれ約50%)で構成される複雑で非効率的なビルドシステムがあり、これにはgitサブモジュールリポジトリも含まれます。また、全体を多かれ少なかれうまく管理する自家製のスクリプトもあります。 (クローズドソース)コードベースの主なポイントは、それが密結合されており、すべてのプロジェクトが同じバージョンで同時にリリースされることです。 これをよりシンプルなシステムと単一のVCSに移行し、gitサブモジュール、google Repo、monoreposなど、いくつかのオプションを検討しています。最終的なVCS​​はまだ定義されていません(それを義務付けるオプションを除きます)。svn、git、またはそれが私たちの状況により適している場合は他のものでもかまいません。 各ソリューションのプラスとマイナスをリストしようとしていますが、モノレポで現在抱えている大きな問題の1つは、外部エンティティと一部のモジュールを共有することは簡単に思えないことです。これらの人々がそれらのモジュールをチェックアウトして正常に動作できるようにしたいが、残りのレポジトリのコードや履歴にアクセスできないようにする必要があります。現時点で私たちが頻繁にまたは大々的にやることではありませんが、将来的にはそうなる可能性があります。 このような権限管理システムは、VCSシステムに存在しますか? または、この問題を軽減する方法はありますか?

6
呼び出されるオブジェクトを変更する関数/メソッドを説明するために使用される用語は何ですか?
一般的な質問で申し訳ありません。私はあちこち検索しましたが、これに似たスレッドが非常に多く見つかりましたが、特定の質問に答えるスレッドはありません。おそらく、探している用語が存在しないためです。 私の友人はプログラミング、特にJavaScriptを学んでおり、なぜこれが機能しないのかと私に尋ねました。 var a = "Hello World"; a.replace("Hello", "Goodbye"); console.log(a) // Logs "Hello World" 理由は、文字列はJavaSriptでは不変なreplaceので、変更しないためですa。それはBecuase 返す文字列を、あなたのような何かをする必要があると思い... var a = "Hello World"; a = a.replace("Hello", "Goodbye"); console.log(a); // Logs "Goodbye World" ただし、代替はJavaScriptのような関数reverse()であり、それを呼び出すものをすべて変更します。例えば: var fruits = ["Apples", "Oranges", "Bananas"]; fruits.reverse(); console.log(fruits) // ["Bananas", "Oranges", "Apples"] 友人がなぜ機能してreplaceいないのかと私に尋ねると、私は知らない言葉に手を伸ばしていることに気付きました(私が知っている限り)... 「置換関数は________であるため、文字列を「string dot replace」に設定する必要があります。」 reverseは________であるため、「array dot reverse」に等しい配列を設定する必要はありません。 …

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