ソフトウェア工学

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

2
SOAとマイクロサービスの実際の違い
免責事項 私は誰かのつま先を踏んだり、どちらかのコンセプトの愛好家を怒らせたりしていないことを願っています バックグラウンド 私は明確な答えを見つけることなく、サービス指向アーキテクチャとマイクロサービスの真の違いを探していました。 私は次のようなものを読みます: SOAの副作用 SOAはアンチパターン マイクロサービスはSOAの障害を修正するようになりました ESBは実際にはESBではなく、EAIです。 メッセージブローカーへの過度の依存 ベンダーはSOAの概念を悪用し、自社製品の販売を試みています SOAが制御不能に成長する しかし、それでもなお、サービス指向アーキテクチャー(概念として)とマイクロサービス(概念として)の間のアーキテクチャーの違いを明確に定義するものはありません 私が理解したところによると、彼らはどちらも持っています: 1つのことだけを行うサービスプロバイダー これらのサービスをコンシューマーに公開するService Gateway / ESB ESB / Service Gatewayを介してサービスにアクセスするサービスコンシューマー 質問 では、SOAをマイクロサービスに再ラベル付けする以外に何か違いはありますか?マイクロサービスがマクロになることを制限するために配置されたテクノロジーの制約ですか? 注:箇条書きで意見を探すのではなく、難しい事実を探しています。 参考文献 ソフトウェア工学の質問 マーティン・ファウラーのサイト(彼はそれが大いに嫌いだと思う) 情報の世界 マイケル・フェザースのウェブサイト スタックオーバーフローの質問 更新 スタックオーバーフローの質問でも同様の議論が起こったようです。意見が分かれるかどうかにかかわらず、マイクロサービスは変装したサービス指向アーキテクチャーです。 SOの質問からの結論: MSはSOAの特殊なケースです MSは、サービスをホスティングするアプリケーションのより小さなサイズを推奨します MSはテクノロジーに依存します(オープンプロトコルオプションではなくHTTPの使用) MSはテクノロジーを利用して規律を強化します(サービスの自動展開) MSはESB(悪)を考慮しますが、IMHOがESBの一種である APIゲートウェイを使用します 次の条件に当てはまる場合、MSはSOAであると結論付けます。 MSはオーケストレーションの概念をサポートしていますか?ワークフローを管理する1つ以上のマスタープロセス MSにメッセージブローカーレイヤーはありますか?メッセージフォーマットをサービスプロデューサーのメッセージスペースからサービスコンシューマーに変換する一連のアダプター マイクロサービスはモノリシックエンタープライズアプリケーションからデータを読み取ることができますか?モノリシックアプリケーションのAPIにすることはできますか?それとも独立して動作できるスタンドアロンの自己完結型アプリケーションでなければなりませんか? 最後の質問に対する答えが「いいえ」であることが判明した場合、マイクロサービスは、クレジットカード管理システムや照合システムなどの複雑なワークフローシステムを処理することができません。

3
コンパイラは通常、インストールされているプラ​​ットフォームの実行可能ファイルのみを生成するのはなぜですか?
私はC ++開発者であり、クロスプラットフォーム開発をよりよく理解するために、コンパイラーの実装の詳細と、コンパイラーがOS固有のバイナリーを正確に作成する方法をよりよく理解しようとしています。私の調査の最中に、少なくともしばらくの間、特定のプラットフォーム用にダウンロードしたほとんどのコンパイラーは、そのプラットフォーム用のバイナリーのみをコンパイルすることに気付きました。したがって、Windows用のコンパイラexeが付属しているIDEをダウンロードした場合、そのコンパイラはx86-x64 Windowsアプリケーション用のプログラムのみをコンパイルでき、LinuxまたはMacアプリケーションはコンパイルできません。 現在、プラットフォームごとに異なるバイナリ形式が必要であることを理解していますが、WindowsのビジュアルC ++コンパイラーがLinuxバイナリ実行可能ファイルを生成するのが難しいのはなぜですか?実行中のCPUのアセンブリ命令とOS固有のライブラリがある限り、任意のマシンの任意のプラットフォーム用の実行可能ファイルをコンパイルできませんか?

3
複数のスイッチケースを持つアプリケーションをリファクタリングするにはどうすればよいですか?
整数を入力として受け取り、その入力に基づいて異なるクラスの静的メソッドを呼び出すアプリケーションがあります。新しい番号が追加されるたびに、別のケースを追加して、異なるクラスの異なる静的メソッドを呼び出す必要があります。現在、スイッチには50のケースがあり、別のケースを追加する必要があるたびに、震えます。これを行うより良い方法はありますか? 私はいくつか考えて、このアイデアを思いつきました。私は戦略パターンを使います。スイッチケースを持つ代わりに、キーが入力整数である戦略オブジェクトのマップがあります。メソッドが呼び出されると、オブジェクトが検索され、オブジェクトのジェネリックメソッドが呼び出されます。このようにして、switch case構文の使用を回避できます。 どう思いますか?

1
OSSプロジェクトの統合テスト-認証でサードパーティを処理する方法?
私の(オープンソースの)趣味プロジェクトの1つは、GitHub、Bitbucketなどからリポジトリのオフラインバックアップを作成するバックアップツールです。 ホスティング事業者のAPIを呼び出してリポジトリのリストを取得し、Git / Mercurial /何でもクローン/リポジトリをローカルコンピュータにプルします。 したがって、認証を使用してGitHub APIを呼び出す統合テストがあります。 (そして、クローン/プル機能が終了すると、おそらくGitHubからリポジトリをクローンするテストがあり、認証も必要になります) 特にこれらの統合テストで使用するユーザーと組織を作成しました。 問題:オープンソースであり、コードがGitHubで公開されているため、ソースコードのどこかにパスワードをハードコードすることはできません。 私が今やっていること テストでは、環境変数からすべてのユーザー名、パスワード、リポジトリ名を取得しています。 次に例を示します。 config.Name = TestHelper.EnvVar("GithubApiTests_Name"); config.Password = TestHelper.EnvVar("GithubApiTests_PW"); (TestHelper.EnvVar環境変数の値を取得し、存在しない場合は例外をスローするヘルパーメソッドです) 次に、これらの環境変数を設定するバッチファイルがあります。 実際のenvironment-variables.batスクリプト()は、ビルドスクリプトでテストを実行する前に呼び出されますが、ソース管理では無視されるため、実際にはリポジトリにありません。 何でソースコントロールであるでenvironment-variables.bat.sampleはなく、偽のパスワードで、同じ環境変数を設定し、: rem copy/rename this file to environment-variables.bat echo Setting environment variables for integration tests... set GithubApiTests_Name=scm-backup-testuser set GithubApiTests_OrgName=scm-backup-testorg set GithubApiTests_PW=not-the-real-password set GithubApiTests_Repo=scm-backup リポジトリを自分のマシンに複製し、このファイルの名前をに変更しenvironment-variables.bat、偽のパスワードを実際のパスワードに置き換えると、すべての統合テストが機能します。 これは継続的インテグレーションでも機能します。私はAppVeyorを使用しており、Web UIでこれらの環境変数を設定できます。 それについて私が嫌いなこと 私はそれがOSSプロジェクトにとって、特にこのプロジェクトにとっては良い解決策ではないと思います: 理論的には、私のプロジェクトの貢献者は、次の方法で統合テストをすぐに実行できます。 …

2
ゲッターのみのインターフェースはコードの匂いですか?
(私はこの質問を見ましたが、最初の答えはデザインよりも自動プロパティに関するもので、2番目の答えは、データストレージコードをコンシューマから隠すことです。これは、自分のコードが何をしたいのかわからないのですが、他の意見も聞きたいです) 私には2つの非常に類似したエンティティがHolidayDiscountありRentalDiscount、「それが少なくとも続く場合numberOfDays、percent割引が適用される」として長さ割引を表します。テーブルにはさまざまな親エンティティへのアクセス権があり、さまざまな場所で使用されますが、それらが使用される場所には、適用可能な最大の割引を取得するための共通のロジックがあります。たとえば、aにHolidayOfferはの数がありHolidayDiscounts、そのコストを計算するときは、該当する割引を計算する必要があります。レンタルと同じですRentalDiscounts。 ロジックは同じなので一箇所に留めておきたい。これが、次のメソッド、述語、およびコンパレータが行うことです。 Optional<LengthDiscount> getMaxApplicableLengthDiscount(List<LengthDiscount> discounts, int daysToStay) { if (discounts.isEmpty()) { return Optional.empty(); } return discounts.stream() .filter(new DiscountIsApplicablePredicate(daysToStay)) .max(new DiscountMinDaysComparator()); } public class DiscountIsApplicablePredicate implements Predicate<LengthDiscount> { private final long daysToStay; public DiscountIsApplicablePredicate(long daysToStay) { this.daysToStay = daysToStay; } @Override public boolean test(LengthDiscount discount) { return daysToStay >= discount.getNumberOfDays(); …

1
機能スタイルは依存関係のモックにどのように役立ちますか?
最近のJava Magazine号のKent Beckへのインタビューから: Binstock:マイクロサービスについて説明しましょう。一部のサービスが機能するためには、他のサービスの束全体の存在が必要になるという意味で、マイクロサービスのテストファーストは複雑になるように思えます。同意しますか? ベック:1つの大きなクラスまたはたくさんの小さなクラスを持つことについては、同じトレードオフのセットのようです。 Binstock:そうです、私が推測する場合を除いて、特定のサービスをテストできるシステムをセットアップできるようにするためには、ここでは非常に多くのモックを使用する必要があります。 ベック:そう思わない。命令型のスタイルの場合は、モックをたくさん使用する必要があります。外部依存関係がコールチェーンの上位に集められている関数型のスタイルでは、それは必要ないと思います。単体テストから多くの報道を得ることができると思います。 彼はどういう意味ですか?機能的なスタイルで、外部の依存関係をあざけることからどのように解放できますか

3
オブジェクト初期化子でビルダーと流体インターフェースを使用することに意味がありますか?
JavaおよびC#では、パラメーターを使用してコンストラクターを定義するか、オブジェクトの作成後に各プロパティを定義するか、ビルダー/流体インターフェイスパターンを使用して、初期化時に設定できるプロパティを持つオブジェクトを作成できます。ただし、C#3ではオブジェクトとコレクションの初期化子が導入されたため、ビルダーパターンはほとんど役に立たなかった。イニシャライザのない言語では、ビルダーを実装して次のように使用できます。 Vehicle v = new Vehicle.Builder() .manufacturer("Toyota") .model("Camry") .year(1997) .colour(CarColours.Red) .addSpecialFeature(new Feature.CDPlayer()) .addSpecialFeature(new Feature.SeatWarmer(4)) .build(); 逆に、C#では次のように記述できます。 var vehicle = new Vehicle { Manufacturer = "Toyota", Model = "Camry", Year = 1997, Colour = CarColours.Red, SpecialFeatures = new List<SpecialFeature> { new Feature.CDPlayer(), new Feature.SeatWarmer { Seats = 4 } } } …

2
GPL付きのデュアルライセンスとクローズドソースライセンス
私はこれについて多くの研究をしましたが、私はまだかなり混乱しています。 現在、Arduino互換のソフトウェアプロジェクトに取り組んでいます。プロジェクトはオープンソースなので、他の人にも利用してもらいたいが、クローズドソースのライセンスで派生作品を作ってほしくない。彼らが私のプロジェクトから派生したものとして使用しているコードを私の仕事から派生したものであると認めてもらい、派生物のオープンソースも維持するように彼らに要求します。 同時に、プロジェクトに基づいてクローズドソースである作品を将来的に作成したい場合があります。たとえば、プライベートなクローズドソースのコンサルタントで自分の作品を使用できるようにしたいと考えています。 最初の部分では、GPLが最も適切なライセンスだと思います。私の質問は、どのライセンスが2番目の部分をカバーするかです。また、そのライセンスをGPLとデュアルライセンスできますか?

1
MITライセンスコードの一部をクローズドソースプロジェクトに含めることはできますか?
これは単純なイエス/ノーの答えかもしれませんが、詳細な説明をお願いします。 シナリオ 私は仕事でクローズドソースシステムを拡張するように求められましたが、これはいかなるライセンスの下でも正式にリリースされていません。一度学んだことはすべての権利がデフォルトで予約されていることを意味すると思っていましたが、現在そのソースを見つけることができません。間違っている場合は修正してください。 MITライセンスの下でリリースされたプロジェクトをGithubで見つけました。これには、要求された機能の一部を実現するために使用したいクラスが含まれています。 それが違いを生む場合、私が取り組むように依頼されたアプリケーションは現在販売されていません。運用を容易にするために内部で使用されるだけで、高度にカスタマイズされており、市場価値はありません。それがクローズドソースである唯一の本当の理由は、インターネットに公開されているエンドポイントがあり、オープンソースコードで脆弱性が発見された場合に管理が悪用される可能性があるためです。 私の理解 この回答は、MITのライセンスに含まれていないと私が確信しているコピーレフトの条項を確認するよう警告しています。間違っている場合は、もう一度訂正してください。 MITライセンスには明記されています... 上記の著作権表示とこの許可通知は、ソフトウェアのすべてのコピーまたは実質的な部分に含まれるものとします。 ...そのため、ライセンスをプロジェクト内に逐語的に含める必要があることを理解していますが、これによりMITライセンスの下でプロジェクト全体が事実上解放されるのではないかと心配しています。 この回答では、Githubプロジェクトコードを隔離することを推奨しています。これは、gitサブツリーとして問題なく実行できることを知っています。しかし、2つの非常に類似したオープンソースライセンスが関係しているため、この状況が異なるのではないかと心配しています。 質問 スーパープロジェクトのルートに次のようなライセンスが必要ですか? プロジェクトFooの一部の著作権は、プロジェクトバーの一部として[MITの原作者、年]が保有し、MITライセンスの下で提供されます。プロジェクトFooのその他すべての著作権は[あなたの名前、年]に帰属します。 また、プロジェクトの正確な「部分」がMITライセンスに属していることを参照することについて、より具体的にする必要があるのでしょうか。 免責事項 ここでの回答/コメントが法的助言とはならないことを完全に理解していますが、何かを完全に誤解している場合は、適切な平手打ちを使用することができます。また、これが私の最初の質問です。これがここに属さない場合は、これらの回答から推測されると思われます。その場合はお知らせください。この質問の適切な場所を教えていただければ幸いです。

4
ドメイン駆動設計とクロスドメイン相互作用
私は比較的DDDの初心者ですが、知識を沸騰させて蒸留するために手に入れることができるあらゆるものを読んでいます。 私はこのDDDの質問に出くわし、その答えの1つに興味をそそられました。 DDDバウンドコンテキストとドメイン? 回答の1つで、ポスターは、製品が少なくとも2つのドメインにあるeコマースシステムの例を示しています。 1)製品カタログ2)在庫管理 わかりました。つまり、eコマースのフロントエンドでは、商品情報の表示に関心があり、在庫管理には関心がありません。 だが。Webページに在庫レベルを表示したり、在庫のエディション番号を表示したりすることができます(在庫が本、雑誌などであるとします)。この情報は、インベントリドメインから取得されます。 それで、これをどのように処理しますか?あなたは a)製品ドメインと在庫ドメインの両方の集合体をロードしますか?b)在庫数と在庫数の製品ドメインエンティティの一部のプロパティを保持し、在庫エンティティが更新されたときにドメインイベントを使用してこれらを更新しますか? 最後の質問です。私たちはドメインの永続性を忘れ/無視し、ドメインについて考えることを意図していることを知っています。しかし、これをよく考えてみると、上の例では、製品カタログと製品在庫用に2つのDBテーブルが存在する可能性があります。これらは同じ製品なので、同じ識別子を使用しますか?または、データに1つのテーブルと1つのテーブル行を使用して、関連するデータを集計プロパティに単純にマップできますか?

1
1行の関数で構成されたデータ変更パイプラインの単体テスト
メアリーローズクックの「関数型プログラミング入門」を読んで、アンチパターンの例として def format_bands(bands): for band in bands: band['country'] = 'Canada' band['name'] = band['name'].replace('.', '') band['name'] = band['name'].title() 以来 関数は複数のことを行います 名前は説明的ではありません 副作用があります 提案された解決策として、匿名関数のパイプライン化を提案します pipeline_each(bands, [call(lambda x: 'Canada', 'country'), call(lambda x: x.replace('.', ''), 'name'), call(str.title, 'name')]) ただし、これにはテストしにくいという欠点があります。少なくともformat_bandsには、意図したとおりに機能するかどうかを確認する単体テストがありますが、パイプラインをテストする方法はありますか?あるいは、匿名関数は説明不要なので、テストする必要がないという考えですか? このための実際のアプリケーションは、pandasコードをより機能的にすることです。「変更」機能の中にある種のパイプラインがあることがよくあります def munge_data(df) df['name'] = df['name'].str.lower() df = df.drop_duplicates() return df または、パイプラインスタイルで書き換えます。 def munge_data(df) munged …

4
REST APIは、日時を適切なクライアントのタイムゾーンに変換できる必要がありますか?
APIの実装中に、日時とタイムゾーンの問題が発生しました。 データベースでは、すべての日付がUTCに正規化されています。現在、非APIアプリケーションでは、すべての日時は、表示される前にまずユーザーの設定に基づいて変換されます。 APIについても同じ質問が浮上しました。APIは、要求のセマンティクスに基づいて、タイムゾーンに適した日時を返すことができる必要がありますか? 例えばGET /posts?timezone=America/Sao_Paulo? それとも、APIにアクセスしているクライアントで実行する必要がありますか? 更新:数回発生したため:現在、タイムゾーン付きのタイムスタンプが返されます(ただし、常にTZオフセットです+00:00)。形式は人気のある8601です。2015-10-29T23:00:49+00:00
10 rest  api  time 

4
不変性を保証することは、プロパティではなくフィールドを公開する正当な理由ですか?
C#の一般的なガイダンスは、常にパブリックフィールドではなくプロパティを使用することです。これは理にかなっています。フィールドを公開することで、実装の詳細の多くを公開することになります。プロパティを使用すると、その詳細をカプセル化して、コードを消費しないようにし、実装の変更をインターフェイスの変更から切り離します。 ただし、readonlyキーワードを処理するときに、このルールに有効な例外が時々あるかどうか疑問に思っています。このキーワードをパブリックフィールドに適用すると、不変性が保証されます。これは単なる実装の詳細ではなく、不変性は消費者が関心を持つ可能性のあるものです。readonlyフィールドを使用すると、フィールドがパブリックコントラクトの一部になり、パブリックインターフェースを変更することなく、将来の変更または継承によって破壊されないものになります。プロパティが提供できないものです。 それでは、不変性を保証することが、readonly場合によってはプロパティよりもフィールドを選択する正当な理由でしょうか? (明確にするために、クラスの設計の一部として意味があり、契約に不変性を含めることが意図されている場合にのみ、現時点でフィールドが不変であるという理由だけで、常にこの選択を行うべきだと言っているわけではありません。私は主に、メンバーがにある必要があるinterface場合や遅延読み込みを行う場合など、正当化できない特定のケースではなく、これが正当化されるかどうかに焦点を当てた回答に関心があります。)

3
プログラマに強制的に定義させる基本クラスの抽象プロパティ
組み込みデバイスの状態パターンでコーディングしています。Stateと呼ばれる基本/抽象クラスがあり、各離散(コンクリート)状態クラスが抽象状態クラスを実装します。 Stateクラスには、いくつかの抽象メソッドがあります。ディスクリート(コンクリート)クラスに抽象メソッドを実装しない場合、Visual Studioは次のようなエラーを出します。 ...エラー1 'myConcreteState'は継承された抽象メンバー 'myAbstractState'を実装していません さて、StateNameというStateごとにStringプロパティを作成しようとしています。新しい具象クラスを作成するときはいつでも、StateNameを定義する必要があります。使用しない場合はVSでエラーをスローする必要があります。これを行う簡単な方法はありますか? 私は抽象/基本クラスでこれを試しました: public abstract string StateName { get; set; } ただし、各状態にGetメソッドとSetメソッドを実装する必要はありません。 改訂された質問:理想的な状況では、各Stateクラスは、StateNameを定義して抽象基本クラスから継承する必要があります。 StateName = "MyState1"; //or whatever the state's name is そのステートメントがない場合、Visual Studioは上記のエラーを生成します。これは可能ですか?可能な場合、どのようにですか?

3
ブログでコードのライセンスを表示/明確化する方法
のは、私が持っていると言うのブログの一つ下で利用可能なクリエイティブ・コモンズのライセンスを。このようなタイプのライセンスは、実際のライセンスへのリンクなどとともに各ページの下部に表示されます。 ただし、クリエイティブコモンズライセンスはソフトウェアやソースコードの配布には実際には適していないようです。そのため、ブログ投稿の一部となる可能性のあるコード(スニペット/フラグメント、さらには完全なプログラムなど)についてはどうでしょうか。 私がこのコードをGPLv3としてリリースすることを選択した場合、ページの下部に次のように言うことは十分許容でき、明確です。 GPLv3の下でリリースされているコードスニペット/フラグメント/サンプルの形でソースコードを、「? または、そのような状況を明らかにするためのより良い/異なる/より正式な方法はありますか?

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