ソフトウェア工学

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

6
自動テストの作成を開始する必要があるのは、アジャイルのどの段階(SCRUM)ですか?
私のちょっとした背景-私はSCRUM(1〜2週間のスプリント)を使用したアジャイル環境内で約2年間、手動テスターです。そこで、Selenium WebDriver(Javaを使用)を使用した作業に自動化テストを導入したいと思います。 私の質問は、いつ機能を手動でテストする必要があるか、いつ自動化テスト用に変換する必要があるかです。 私は次のようなさまざまなアプローチを読んでいます。 新しいスプリントの開始時に、ユーザーストーリーを以前のスプリントの自動スクリプトに変換するか、または 同じスプリント内でユーザーストーリーを変換します。 アドバイスは非常にいただければ幸いです。前もって感謝します。

2
クリーンなアーキテクチャのためにサービスとリポジトリの間のレイヤーを使用する必要があります-Spring
私はアーキテクチャで作業しています。Webクライアントおよびモバイルアプリ用のREST APIを提供する予定です。私はSpring(spring mvc、spring data jpaなど)を使用しています。ドメインモデルは、JPA仕様でコーディングされています。 クリーンアーキテクチャのいくつかの概念を適用しようとしています(https://8thlight.com/blog/uncle-bob/2012/08/13/the-clean-architecture.html)。すべてではありません。これは、jpaドメインモデルを維持するためです。 レイヤーを通過する実際の流れは次のとおりです。 フロントエンド <-> APIサービス -> サービス -> リポジトリ -> DB フロントエンド:Webクライアント、モバイルアプリ APIサービス:Rest Controllers、ここではコンバーターとdtoと呼び出しサービスを使用しています サービス:実装とインターフェースし、ビジネスロジックを含みます リポジトリ:CRUD操作とおそらくいくつかのSQLクエリを含む自動実装(Spring Data JPAによって実行)とのリポジトリインターフェイス 私の疑問:サービスとリポジトリの間に追加のレイヤーを使用する必要がありますか? 私はこの新しいフローを計画しています: フロントエンド <-> APIサービス -> サービス -> 永続性 -> リポジトリ -> DB なぜこの永続化レイヤーを使用するのですか?クリーンアーキテクチャの記事で述べているように、不可知論的永続性レイヤーにアクセスするサービス実装(ビジネスロジックまたはユースケース)が欲しいです。また、リポジトリの使用を停止する場合など、別の「データアクセス」パターンを使用する場合は、変更は必要ありません。 class ProductServiceImpl implements ProductService { ProductRepository productRepository; void save(Product product) { // do …

3
APIオブジェクトの定義にサードパーティの参照IDをプロパティとして含めるのは悪い習慣ですか?
このような: Campaign: type: object properties: id: type: string description: "A GUID identifier" referenceId: type: string description: "A consumers identifier they have used to map their own systems logic to this object." name: type: string description: "'Great Campaign 2017' as an example" referenceIdが心配です。 システムドメインは、さまざまな形式(xml、excel)のデータのエクスポートおよびインポートを通じて、サードパーティと多くの方法で統合されるプラットフォームです。サードパーティがAPIを介してシステムと統合できるように十分に成熟しており、このAPIの設計がこの疑問を引き起こします。 リソースを識別して取得するために使用できるIDを持つオブジェクト、キャンペーンがあります。APIの利用者は、ドメイン内のキャンペーンと見なすものへの独自の参照コードを持っている場合があります。 私たちのシステムには、このようなサードパーティの参照フィールドを持つ他のオブジェクトがあり、既存のコンシューマーから期待されています。ただし、マッピングの負担がかかり、このreferenceIdが何であるか(数値、テキスト、json?)がわからないため、新しいコンシューマー向けの混乱するプロパティがAPIに追加されます。 APIのパブリックオブジェクト定義でサードパーティの参照IDフィールドを許可することは、不適切な手法または不適切な設計と見なされますか?

1
ビジネスロジックとサービスレイヤー
私はこの答えを読みます:https : //softwareengineering.stackexchange.com/a/234254/173318私の理解を訂正してください。 ビジネスルールとは、現実の世界でのビジネスのステップのリストを指します(コードなし)。 ビジネスロジックは、ビジネスルールをコードに変換するプロセスと、「ビジネスロジック」と呼ばれるこれらのコードの束/種類を指します。 また、サービス層は何に使用されますか?私がこの答えを読んだ場合、それはビジネスロジックと同じように聞こえますhttps://stackoverflow.com/a/4817935/4190539 サービスレイヤーは、ビジネスロジックとリポジトリが出会う場所ですか?

1
ソフトウェア/ファームウェアの自動更新戦略
「クライアントデモ用のカフェインを使用した粗雑なプロトタイプ」フェーズの終わりに近づいており、「将来を考える」フェーズに移行する中規模プロジェクトができました。プロジェクトは、ソフトウェアとファームウェアを備えたLinuxベースのデバイス、および中央管理Webサーバーで構成されています。現在10個のプロトタイプが存在し、生産は1000年代のオーダーになると予想されます。 自動更新の技術に精通しておらず、時間が足りないので、私は自分のソフトウェアの展開/自動更新戦略をすぐに展開しました。現在、次の要素で構成されています。 ホストされたgitリポジトリ(GitLab)と本番リリースブランチ(Webサーバーのソースもこの同じリポジトリにあることに注意してください)。 次のようなWebインターフェースの「更新の展開」ボタン 最新バージョンを本番リリースブランチからローカルリポジトリエリアにプルし、それを一時パッケージ準備ステージングエリアにもコピーします。 ステージング領域でサニタイズスクリプト(リポジトリに格納されている)を実行して、無関係なソースファイル(サーバーソース、ファームウェアソースなど)と.gitファイルを削除します。 現在のgitハッシュを更新パッケージのファイルに書き込みます(目的は以下で明らかになります)。 すべてうまくいった場合は、gzipで圧縮し、以前のgzipで圧縮されたパッケージを同じ名前のファイルで上書きしてサービスの準備を整え、ステージング領域を削除します。 サーバー上に現在のデバイスソフトウェアの2つのコピーが存在することに注意してください。これらは同期がとられていることが期待されています。同じバージョン。 デバイス上のソフトウェアは、という名前のディレクトリに自己完結し/opt/example/currentています。これは、ソフトウェアの現在のバージョンへのシンボリックリンクです。 起動時に次のことを行うデバイスの自動更新機能: do_not_updateファイルの存在を確認し、ファイルが存在する場合はそれ以上のアクションを実行しません(開発デバイスについては、以下を参照してください)。 上記のテキストファイルから現在のコミットハッシュを読み取ります。 そのハッシュをクエリパラメータとして使用して、サーバーにHTTPリクエストを送信します。サーバーは304(ハッシュは現在のバージョン)で応答するか、gzip圧縮された更新パッケージを提供します。 更新パッケージを受け取った場合は、次の方法でインストールします/opt/example。 という名前のフォルダーに更新されたソフトウェア情報を抽出していますstage。 更新に必要なローカル変更などを行う更新パッケージからのインストール後スクリプトの実行 現在のソフトウェアルートフォルダーをにコピーしますprevious(存在するprevious場合は、最初に既存のものを削除します)。 stageフォルダをコピーしますlatest(存在するlatest場合は、最初に既存のものを削除します)。 確保currentへのポイントへのシンボリックリンクをlatest。 デバイスを再起動します(ファームウェアの更新がある場合は、再起動時に適用されます)。 新しく構築されたデバイスでの初期展開の問題もあります。デバイスは現在 SDカードベースである(ここでは範囲外の独自の問題があります)ため、このプロセスは次のように構成されます。 以前のバージョンのソフトウェアが含まれているSDイメージが存在します。 この画像からSDカードが作成されます。 初回起動時に、さまざまな初回のデバイス固有(シリアル番号ベース)の初期化が行われ、その後、オートアップデーターがソフトウェアの最新の製品バージョンを取得して通常どおりインストールします。 さらに、開発デバイスのサポートも必要でした。開発デバイスの場合: 完全なローカルgitリポジトリがデバイスで維持されます。 currentシンボリックリンクは、開発ディレクトリを指します。 do_not_update自動アップデーターがプロダクションアップデートで開発コードを吹き飛ばすのを防ぐローカルファイルが存在します。 現在、展開プロセスは理論的には次のように意図されていました。 コードをデプロイする準備ができたら、リリースブランチにプッシュします。 サーバーの[更新の展開]ボタンを押します。 これでアップデートが公開され、デバイスは次回チェック時に自動更新されます。 しかし、そこにあるトン実際に問題のは: Webサーバーのコードはデバイスのコードと同じリポジトリにあり、サーバーにはローカルのgitリポジトリがあり、それを実行しています。最新のWebサーバーコードが最新のデバイスコードと同じブランチにありません。ディレクトリ構造に問題があります。[更新のデプロイ]ボタンをクリックすると、最新バージョンが本番ブランチからプルされ、サーバーコードのサブディレクトリにプルされます。つまり、サーバーに最初からデプロイする場合、デバイスのプロダクションブランチをそこに取り込むことにより、このサブディレクトリを手動で「シード」する必要があります。これは、おそらくgit user errorから、デプロイを試みないと、親ディレクトリのWebサーバーブランチからデバイスコードをプルします。これは、ステージング領域をサーバーのローカルgitリポジトリのサブディレクトリにしないことで解決できると思います。 Webサーバーは現在、デバイスソフトウェアのgitハッシュを永続的に維持していません。サーバーの起動時に、git rev-parse HEADローカルデバイスソフトウェアリポジトリで現在のハッシュを取得します。理由がわからないため、ここでは説明しませんが、大量の論理エラーが発生しています。サーバーを再起動すると、特にサーバーが新品で生産がない場合は、問題が発生する可能性があります。ブランチリポジトリはまだ引っ張られています。リクエストがあれば喜んでそのロジックのソースを共有しますが、この投稿は長くなりつつあります。 何らかの理由でサニタイズスクリプト(サーバー側)が失敗した場合、サーバーには最新のレポが残されますが、同期git rev-parse HEADが取れておらず、更新パッケージがないため、実際のハッシュと一致しないハッシュが返されますここで問題はサーバーのコマンドラインで手動で修正する必要があります。つまり、サーバーは更新パッケージが正しくないことを認識しておらず、純粋な信念で常にそうであることを前提としています。これを前のポイントと組み合わせると、サーバーは実際には非常に壊れやすくなります。 最大の問題の一つは:デバイス上で動作しているデーモン全く別のアップデータは現在ありません。wifiインターネットアクセスが来るのを待っている複雑さといくつかの土壇場のハッカーのため、デバイスをチェックして更新するのはメインのデバイス制御ソフトウェア自体です。これは、テストが不十分なバージョンが何らかの形で本番環境に移行し、制御ソフトウェアが起動できない場合、存在するすべてのデバイスは、それ自体を更新できなくなるため、本質的に機能しなくなることを意味します。これは、本番環境では絶対的な悪夢です。不運なときに電源が切れた場合の単一のデバイスの同じ取引。 その他の主な問題は次のとおりです。増分更新はサポートされていません。たとえば、しばらくの間デバイスの電源が入っていない場合、次にデバイスが更新されたときに、一連のリリースバージョンがスキップされ、直接バージョンスキップの更新を実行できる必要があります。この結果、更新された展開は、特定の更新を特定の過去のバージョンの上に適用できることを確認するという悪夢になります。さらに、gitハッシュはバージョン番号ではなくバージョンを識別するために使用されるため、増分更新を容易にするためのバージョンの辞書式比較は現在不可能です。 現在サポートしていない新しい要件は、管理サーバー側で構成する必要があるデバイスごとの構成オプション(キー/値のペア)がいくつか存在することです。ソフトウェアの更新と同じHTTP要求でデバイスにこれらのデバイスごとのオプションを提供することはどうしても構いません(多分、それをHTTPヘッダー/ Cookieにカプセル化できます)。常に別のHTTPリクエストにします。 ハードウェアの2つのバージョン(および将来的にはさらに多く)のハードウェアが存在するため、多少複雑になります。ハードウェアの現在のバージョンは、実際には初期SDイメージの環境変数として格納され(それらは自己識別できません)、すべてのソフトウェアはデバイスのすべてのバージョンと互換性があるように設計されています。ファームウェアの更新はこの環境変数に基づいて選択され、更新パッケージにはハードウェアのすべてのバージョンのファームウェアが含まれています。ちょっと不格好ですがこれで我慢できます。 現在、手動で更新をデバイスにアップロードする方法はありません(要するに、これらのデバイスには2つのwifiアダプターがあり、1つはインターネットへの接続用で、もう1つはユーザーがデバイスの構成に使用するAPモードです。将来的にはデバイスのローカルウェブインターフェースに「アップデートソフトウェア」機能を追加するつもりです)。これは大きな問題ではありませんが、更新のインストール方法にある程度の影響を与えます。 …

1
オブジェクトがインターフェイスの一部のみを使用する場合、インターフェイスをどのように構成しますか?
同じテーブルを更新するデータベースアクセスオブジェクトを必要とする2つのクラスがあるプロジェクトがあります。フレームワークとプロジェクトの制約により、これら2つのクラスを組み合わせることはできません。以下のケースを作成して、セットアップ方法を示します。クラスAはレコードを更新および読み取りできる必要があり、クラスBはレコードを更新および削除できる必要があります。 クラスをそのまま使用すると問題なく機能しますが、各クラスが実装に使用していない機能を必要とするという問題があります。たとえば、クラスAを使用するには、削除関数が呼び出されない場合でも、削除関数を実装するdaoを渡す必要があります。同様に、クラスBにread関数を実装するdaoを渡す必要がありますが、呼び出されることはありません。 他を継承するインターフェイス(IReadDao、IUpdateDao、IDeleteDaoは継承元のdaos)を使用してアプローチすることを考えましたが、このアプローチでは基本的に、関数の組み合わせごとに異なるインターフェイス(IUpdateAndRead、IReadAndDelete、IReadAndUpdate ... ) アプリケーションとデータベースを結合したくないので、daoのインターフェースを使用します。誰かが知っている私がやりたいことを達成するためのパターンや方法はありますか?前もって感謝します。 class IDao { void update(ModelDao model); void delete(String guid); ModelDao read(String guid); } Class A { private IDao dao; public A(IDao dao) { this.dao = dao; } public void doStuff() { ModelDao model = new ModelDao(); ... dao.update(model); } public void readThenDoSomething(String id) { …

7
スクラムデイリースタンドアップミーティングでチェックインに関連しないディスカッションを行うことは許容されますか?
人々が私に潜在的に明白な質問を甘やかしてくれることを願っています。私は、毎日スクラムミーティングを行う多くの組織で働いています。一部の組織はチェックインにスクラムのみを使用することに非常に厳格です(「3つの質問」-昨日何をしましたか、今日何をしているのですか、ブロッカーはいますか)。他の一般的な傾向がある他の組織発表または詳細な技術的ディスカッション。 この記事のように、チェックインに関連しないこのようなディスカッションを許可することは誤りであるという意見を聞いたことがあります。スクラムミーティングは、スクラムマスターからの一般的な発表、技術的なディスカッションなどには使用しないでください。 これから私が目にした主な害は、会議が必要以上に長く続く可能性があることです(そして、私に関係のない詳細の議論に座ることを余儀なくされるのは面倒です)。 グループ全体に関連しておらず、「3つの質問」の一部でもないディスカッションは、スタンドアップの一部であってはならないことは明らかです。しかし、グループ全体に関連する他のアナウンスがあり、とにかく議論する必要がある場合、その時点で(個別の会議や電子メールではなく)アナウンスを行うことは有害ですか?

2
開発から製品への構成の変更を効果的に追跡
この質問では、例としてSpring Bootサービスを取り上げていますが、これはどのようなテクノロジーでもかまいません。 次のように仮定します。 環境(dev / QA / prod)は異なるチームによって所有されています。これは、開発者が製品構成にアクセスできないようにする必要があることを意味します。 構成(application.propertiesとしましょう)は外部化されています。つまり、バイナリの一部ではありません。 同じバイナリ/パッケージ(service.jarとしましょう)が各環境にデプロイされ、自動デプロイメントによって制御されます バイナリアーティファクト(service.jar)への変更は自動的に各環境に伝達されますが、構成への変更には依然として手動による介入が必要であり、必然的に各環境で非同期化されます。 たとえば、開発チームが環境内のapplication.propertiesにいくつかのキーと値のペアを追加するとします。これらの新しいキーを記録する最良の方法は何ですか?それで、運用チームで展開が行われるときに、追加するキーが正確にわかっているため、新しいサービスを開始し、キーが見つからないために失敗することを確認するリスクが最小限に抑えられますか? 手動の手順が含まれることはわかっていますが、人々がこれをどのように処理し、最も効果的な方法を見つけるか知りたいです。

3
疎結合のマイクロサービスアーキテクチャでは、依存関係をどのように追跡しますか?
最新のプログラムで人気のある高レベルのアーキテクチャの選択は、RESTベースのマイクロサービスシステムです。これには、疎結合、再利用の容易さ、使用できるテクノロジーの制限の制限、高いスケーラビリティなどのいくつかの利点があります。 しかし、そのようなアーキテクチャーで私が予測する問題の1つは、アプリケーションの依存関係が何であるかについての可視性が低いことです。たとえば、1組のREST呼び出しを毎日使用するアプリケーションがあるとします。このアプリケーションは、REST呼び出しの2番目のセットも使用しますが、四半期に1回だけです。過去1週間のログをスキャンすると、1日のカロリーはすべて表示されますが、四半期ごとの呼び出しは表示されません。リファクタリングの時期になると、四半期ごとの呼び出しが中断するリスクが高くなります。 このリスクを軽減し、疎結合アーキテクチャの依存関係をより詳細に可視化するために使用できるパターンまたはツールは何ですか?

2
オプションの有限セットへの追加。APIの重大な変更?
次の応答モデルを吐き出すHTTP APIエンドポイントを取ります。 { "type": "Dog", "name": "Jessi", ... } typeフィールドは次のいずれかであるとしてドキュメントに記載されているDog、CatまたはFish。 新しいオプションの追加は、たとえばRat、重大なAPIの変更と見なされますか? 有限リスト(開発者がオンにする可能性がある)にオプションを追加することは、APIの拡張または変更と見なされますか?
9 rest  api  api-design  json 

2
機能的なJavaScriptコードをどのように_read_できますか?
JavaScriptでの関数型プログラミングの基礎となる基本概念のいくつか/多く/ほとんどを学んだと思います。ただし、私は関数コード、特に自分で作成したコードを明確に読み取ることができず、誰かが役立つヒント、ヒント、ベストプラクティス、用語などを教えてくれるかどうか疑問に思っています。 以下のコードを見てください。私はこのコードを書きました。これは、say {a:1, b:2, c:3, d:3}との間の2つのオブジェクト間のパーセント類似性を割り当てることを目的としてい{a:1, b:1, e:2, f:2, g:3, h:5}ます。Stack Overflowでこの質問に答えてコードを作成しました。ポスターがどの程度の類似性について尋ねているのか正確にはわからなかったため、4つの異なる種類を用意しました。 2番目にある1番目のオブジェクトのキーの割合、 重複を含む、2番目にある1番目のオブジェクトの値のパーセント 重複が許可されていない、2番目に見つかった1番目のオブジェクトの値の割合、および 2番目のオブジェクトにある1番目のオブジェクトの{key:value}ペアの割合。 私は合理的に命令型のコードから始めましたが、これは関数型プログラミングに適した問題であることをすぐに理解しました。特に、私が比較しようとしている機能のタイプ(例えば、キーや値など)を定義する上記の4つの戦略のそれぞれについて関数または3つを抽出できれば、残りのコードを繰り返し可能な単位に減らす(言葉の遊びを許す)ことができます。あなたはそれを乾いた状態に保ちます。そこで関数型プログラミングに切り替えました。結果にはかなり誇りに思っており、それは適度にエレガントだと思います。 ただし、コードを自分で作成し、構築中にコードのすべての部分を理解したとしても、今振り返ると、特定の半行の読み方と読み方の両方に少し戸惑い続けています。コードの特定の半行が実際に行っていることを「グロッ」と言います。私は、すぐにスパゲッティの混乱に分解するさまざまな部分を接続するために精神的な矢を作ることに気づきました。 だから、誰かが私に、コードのより複雑なビットのいくつかを、簡潔で、私が読んでいるものの私の理解に貢献する方法で「読む」方法を教えてもらえますか?私を最も引き付ける部分は、複数の太い矢印が連続している部分、および/または複数の括弧が連続している部分だと思います。繰り返しになりますが、最終的にはロジックを理解することができますが、関数型JavaScriptプログラミングの行をすばやく明確かつ直接「取り込む」ためのより良い方法があります(私はそう思います)。 以下のコード行、または他の例を自由に使用してください。ただし、私からの最初の提案が必要な場合は、以下にいくつか示します。かなりシンプルなものから始めます。コードの終わり近くから、これがパラメーターとして関数に渡されますobj => key => obj[key]。それをどのように読んで理解しますか?より長い例は、最初から近い1つの完全な関数ですconst getXs = (obj, getX) => Object.keys(obj).map(key => getX(obj)(key));。最後のmap部分は特に私を捕まえます。 ノート、この時点で時間に私はしてくださいないなどハスケルやシンボリック抽象記法やカリー化の基礎への参照を探している私は何をしています探しているコードの行を見ながら、私は口を静かにできることを、英語の文章です。具体的にそれについて具体的に言及している参考文献があればすばらしいですが、私はいくつかの基本的な教科書を読みに行くべきだと言う答えも探していません。私はそれを実行し、私は(少なくともかなりの量の)ロジックを取得しました。また、私は完全な答えは必要ありません(そのような試みは歓迎されますが)。そうでなければ面倒なコードの単一の特定の行を読むためのエレガントな方法を提供する短い答えでさえいただければ幸いです。 この質問の一部は次のとおりだと思います:関数コードを左から右へ、上から下へ直線的に読み取ることはできますか?それとも、明らかに線形ではないコードのページにスパゲッティのような配線の精神的な画像を作成することを強いられていますか?それを行う必要がある場合でも、コードを読み取る必要があるので、線形テキストを取得してスパゲッティを配線するにはどうすればよいでしょうか。 任意のヒントをいただければ幸いです。 const obj1 = { a:1, b:2, c:3, d:3 }; const obj2 = { a:1, b:1, …

3
アジャイルでは、TFSなどの厳格な管理フレームワークを使用して、プロジェクトの開始時の基本的なインフラストラクチャタスクをどのように計画して割り当てますか?
ここで私は、比較的小さな新しいソフトウェア開発プロジェクトの範囲を定め、見積もっている最中です。私は、お客様から提案されたユーザーストーリーに目を通し、それぞれに対してタスクを配置しました。見積もりと、タスクがどのように達成されるかについての簡単なメモを付けました。受け入れ基準があります。すべては世界と良くなるべきです。 予定していた作品を見ていると、何か足りない部分があることに気づきました。機能を追加できるものをセットアップするだけの初期費用がかかります。特定の1つのユーザーストーリーではなく、すべてのユーザーストーリーに属するもの。 たとえば、このアプリケーションの一部は、XMLを解析するサービスです。ユーザーの観点から見ると、XMLの内容に応じてさまざまな処理を行う必要がある特定のストーリーがあります。実際にXMLパーサー(ファイルを探し、それを読み取り、内容をどうするかを決定する前に関連データを取り出すビット)を書くことは、これらすべてのストーリーの一部です。インストーラーなどを使用してWindowsサービスにラップする場合と同様です。これは、ユーザーに直接関係のない開発者中心のタスクです。 この特定のアプリケーションのもう1つの関連する例は、このアプリの機能に役立つ貧弱なレガシーコードのブロックを取得して書き換えることです。繰り返しますが、これはユーザーに直接の結果はありませんが、必要な作業です。ユーザーストーリーに焦点を当てたプロジェクト計画の中で、この作業の計画と実行はどこで「ライブ」ですか? 「開発者として、私はしたい...」というユーザーストーリーを書いて人々がこれを解決するのを見てきましたが、他の場所で議論されているように、これはユーザーストーリーではありません。それは開発者のものです。 私(および他の人)がオンラインでTFSのような厳密な管理フレームワークを使用してプロジェクトを計画するのを助けるために、これに対する具体的な答えを探しています。これらは、「利害関係者の物語」や、計画会議でのスクラムチームによるインフラストラクチャタスクの説明への回答で言及されている他のあいまいなメタソリューションを作成する機能を備えていない傾向があります。

3
ソフトウェアを修正してリアルタイムにする方法は?[閉まっている]
休業。この質問には、より焦点を当てる必要があります。現在、回答を受け付けていません。 この質問を改善してみませんか?質問を更新して、この投稿を編集するだけで1つの問題に焦点を当てます。 3年前休業。 最初に、私はリアルタイムシステムプログラミングの初心者であることを述べたいので、私の質問が正しいかどうかはわかりません。申し訳ありませんが、私はいくつかの助けが必要です 簡単に言え ば、ハードリアルタイムソフトウェアを実装して、ハードデッドラインに確実に対応する方法を教えてください。QNXのいくつかの機能を使用する必要がありますか?それともLinuxでQNXに移植するだけで十分であり、デフォルトでリアルタイムになりますか? 完全な質問: Linux、Windows、Android、QNXのプロセス間通信を備えた複雑なクロスプラットフォームマルチプロセスソフトウェアを実装しました。プログラミング言語はC ++です。他のライブラリのBoostとPlantyを使用しています。私たちのソフトウェアはそれをうまく素早く実行しますが、それでもプロトタイプです。本番環境ではリアルタイムで実行する必要があります。一部の機能はリアルタイムで非常に堅牢である必要があります。これらの機能は非常に重要であり、ソフトウェアを使用するユーザーの安全性に依存している可能性があるためです。それらはかなり速く動作します-数百ミリ秒まで。しかし、この事実のため、私たちのシステムが本当にリアルタイムであるかどうかはわかりません(私は正しいですか?)。 ですから、主な質問があります。ソフトウェアをリアルタイムに変更する方法は?私はたくさんググってみましたが、どうすればいいのかまだわかりません。 プラットフォームに関するいくつかの追加情報:現在テスト目的でのみ使用しているLinuxおよびWindows。Android-必要かどうかはまだ決まっていません。QNX-本番環境のターゲットOSです。次の質問の答えは「いいえ」だと思います:)しかし、クロスプラットフォームのリアルタイムソフトウェア(リアルタイムOS(RTOS)および汎用OS(GPOS)の場合)を実装することはまったく可能ですか? おそらく、QNXにのみすべてのリアルタイム機能を実装するよう努力する必要があるでしょうか。しかし、私はまだそれを行う方法を理解していません。誰かがこの質問に光を当てることができますか?
9 c++  real-time 

2
Javaで書かれたAPIで内部クラスをカプセル化する方法は?
ライブラリを書かなければならない。当然、非常に小さなAPI(必要に応じてできるだけ広い)のみを使用する必要があります。ライブラリの内部はやや複雑です。したがって、構造化が必要です。 構造化について、私は現在2つの方法を考えています。 1.パッケージを使用します。 長所:ライブラリはきちんと構成できます。その場所のすべて。 短所:パッケージの境界線を介したクラスの使用にはパブリッククラスが必要であり、したがってライブラリ全体のAPIを拡張します。 2.すべて1つのパッケージで静的内部クラスを使用します。 長所:必要なパブリッククラス(クラス、メソッドなど)はごくわずかです。 短所:クラスは、それらを構造化するためにのみ非表示になります。これは、非常に多くの静的内部クラスが使用される非常に数少ないユースケースの1つです。開発者はそれに慣れておらず、見落とす可能性があります。 よく構造化されたライブラリで小さなAPIを実現するより良い方法はありますか? 編集:言及するのを忘れていました:Androidライブラリ用です。したがって、java9はありません。

2
これは、C ++の「pImpl」ベースのクラス階層に適したアプローチですか?
インターフェイスと実装を分離したいクラス階層があります。私の解決策は、インターフェイスのハンドルクラス階層と実装の非パブリッククラス階層の2つの階層を持つことです。基本ハンドルクラスには実装へのポインターがあり、派生ハンドルクラスは、派生型のポインターにキャストします(関数を参照getPimpl())。 これは、2つの派生クラスを持つ基本クラスの私のソリューションのスケッチです。より良い解決策はありますか? ファイル「Base.h」: #include <memory> class Base { protected: class Impl; std::shared_ptr<Impl> pImpl; Base(Impl* pImpl) : pImpl{pImpl} {}; ... }; class Derived_1 final : public Base { protected: class Impl; inline Derived_1* getPimpl() const noexcept { return reinterpret_cast<Impl*>(pImpl.get()); } public: Derived_1(...); void func_1(...) const; ... }; class Derived_2 final : …
9 design  c++  c++11 

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