ソフトウェア工学

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

6
プログラミング言語の1番目、2番目、3番目のクラス値の数学の基礎は何ですか?
追加しました 関連する2つの質問を見つけた /math//q/1759680/1281 /programming//a/2582804/156458 プログラミング言語では、Michael ScottのProgramming Language Pragmaticsから 一般に、プログラミング言語の値は、パラメータとして渡されたり、サブルーチンから返されたり、変数に割り当てられたりする場合、ファーストクラスのステータスを持つと言われ ます。整数や文字などの単純な型は、ほとんどのプログラミング言語で最高の値です。対照的に、「セカンドクラス」値はパラメーターとして渡すことができますが、サブルーチンから返されたり変数に割り当てられたりすることはできません。また、「サードクラス」値はパラメーターとして渡すことさえできません。 ラベルは、ほとんどのプログラミング言語では第3クラスの値ですが、Algolでは第2クラスの値です。サブルーチンは最も多くのバリエーションを表示します。これらは、すべての関数型プログラミング言語およびほとんどのスクリプト言語で最も優れた値です。また、C#での最高クラスの値であり、Fortran、Modula-2および-3、Ada 95、C、C ++など、いくつかの他の必須言語では、いくつかの制限があります。11これらは、他のほとんどの命令型言語では第2クラスの値であり、Ada 83では第3クラスの値です。 プログラミング言語の1番目、2番目、3番目のクラス値の数学の基礎は何ですか? 用語は一次/二次のロジックを思い出させますが、それらは関連していますか? それらの違いは、値を使用できる特定のケースであるように思えます パラメータとして渡され、 サブルーチンから返された、または 変数に割り当てられます。 なぜ特定のケースが重要なのに、他のケースは言及されていないのですか? ありがとう。

2
商用製品でのGhostscriptのライセンス
Ghostscriptを商用製品(Windowsデスクトップアプリケーション)で使用する可能性を調査しています。 GSのサイドステッピングライセンスについては、ユーザーにGSをダウンロードしてインストールし、エクスペリエンスを向上させることをユーザーに単に提案することで読みました(ソフトウェアも実際に動作しますが、ほとんどのユーザーはPDFドキュメントをレンダリング/ロードしたいでしょう)。 そのため、Ghostscriptを出荷せず、代わりにソフトウェアに可用性を確認させ、存在しない場合は入手方法を提案します(短い説明テキストとダウンロードページへのリンク)。インストールされている場合、プログラムはGhostscript APIを使用します。 Artifexが「アプリケーションがそれほど条件を満たさない場合、GS を出荷することは許可されない」などのように言っているので、私にはそれは合法的なように思えます。誰かがこれについて意見を共有したいですか?
19 licensing 

3
リレーショナルデータベースと反復開発
アジャイル手法、ドメイン駆動設計、オブジェクト指向分析および設計など、ソフトウェア開発への多くのアプローチでは、開発への1つの反復アプローチを採用することをお勧めします。 そのため、プロジェクトでの作業を初めて開始したときにドメインモデルを正しく実行することは想定されていません。代わりに、時間が経つにつれてモデルをリファクタリングします。なぜなら、時間とともに問題の領域をより深く理解できるからです。 それとは別に、完璧なモデルを事前に取得しようとしても、私はすでに非常に難しいと確信していますが、要件は変わる可能性があります。ソフトウェアがそのようにした後にしている生産に配備され、エンドユーザーは、一定の要件を完全に理解していなかったことに気づくかもしれない、あるいは悪化し、いくつかの要件が欠落していました。 ここでのポイントは、ソフトウェアの展開後にモデルの変更が必要になる場合があるということです。これが発生した場合、問題が発生します。本番データベースには重要なユーザーデータがあり、古いモデルの形式に既に適合しています。 コードが適切に設計されておらず、システムが大きい場合、コードの更新は困難な作業になる可能性があります。しかし、それは時間とともに実行できます。Gitのようなツールを使用すると、本番対応バージョンを損傷することなくそれを実行できます。 一方、モデルが変更された場合、クラスのプロパティが消失した場合など、データベースも変更される必要があります。しかし、問題があります。そこには、失われないデータが既にあり、古いモデル用にフォーマットされています。 ここのリレーショナルデータベースは、エンドユーザーの要求に応じて反復的な開発を行ったり、ソフトウェアを更新したりすることを妨げる障壁になっているようです。 私がすでに使用したアプローチの1つは、古いデータベーステーブルを新しいテーブルにマップする特別なクラスをコーディングすることでした。したがって、これらのクラスは古い形式のデータを選択し、新しいモデルで使用される形式に変換して、新しいテーブルに保存します。 このアプローチは最良の方法ではないようです。ここでの私の質問は次のとおりです。リレーショナルデータベースで反復開発を調整するためのよく知られた推奨アプローチはありますか。

3
C ++の「メソッド」について(「メンバー関数」に対して)話すのはどれほど間違っていますか?
私は理解して C ++の仕様に応じてそこに「方法」のようなものはなく、いくつかのことを(多くの?ほとんどの?)C ++プログラマは、Javaイズムする「方法」を検討してください。一方で、C ++フォーラムでも、人々はけいれんせずにメソッドについて話すようです。この用語に関する既知の慣例または一般的な慣行を探しています。 C ++とJavaの両方のバージョンを持つAPIを文書化しています。開発者は、おそらく移植とテストの利便性のために、クラスとメソッド/メンバー関数の名前を2つの間で同じにしておきました。このため、これらのAPIについて文書化する必要があるものの一部は、言語の選択の「上」にあります。FoosとBarsについて、baz()とmumble()...メソッドで一般的に話せるようにする必要がありますか? Javaプログラマーがそれを自然とみなす方法について話すと、C ++プログラマーはおそらく理解するでしょうが、一部の人はそれが間違っていると考えるでしょう。私の質問は、これは実際にはどれほど凶悪なのですか?C ++固有の関数とは対照的に、「一般的なOOP」コンテキストでは、C ++メンバー関数は従来どのように話題にされていますか?どちらの言語でも正しくない方法でメンバー関数について話すより良い方法はありますか?(「メンバー関数」は少し冗長です。) これは世論調査ではありません。この問題に対処するための実際の慣習や一般的な慣行があるかどうかを判断しようとしています。 私はこの質問を知っていますが、それは一般にOOPに関するものであり、特定の言語については尋ねません。

2
貧血ドメインモデルとドメインサービスインジェクション
貧血のドメインモデルは、 Martin Fowler氏によってドメイン駆動設計におけるアンチパターンとして記載されています。ドメインモデルでビジネスロジックを使用するには、多くの場合、ドメインサービスが使用されます。ただし、ドメインモデルへのドメインサービスの注入は、Vaughn Vernonにとって有害で​​あると考えられています(「ドメイン駆動設計の実装」を参照)。 私の意見では、これらの意見は矛盾している、これは本当ですか?両方のポイントをどのように考慮することができますか? それは実際にされたドメインサービスと豊富なドメインモデルは、注入された対貧血のドメインモデルと通常のドメインサービス?

1
AkkaはJMS / AMQPメッセージブローカーを廃止しますか?[閉まっている]
閉じた。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して事実と引用で答えられるように質問を更新してください。 4年前に閉鎖されました。 先週、Akkaのドキュメントを深く掘り下げ、最終的にアクターシステムとは何か、そしてそれらが解決する問題を理解しました。 私の従来のJMS / AMQPメッセージブローカーの理解(および経験)は、以下を提供するために存在するということです。 プロデューサーとコンシューマー間の非同期処理。そして 持続性、再試行、フォールバックを含むメッセージ配信の保証 しかし、Akkaはこれを提供し、必要なインフラストラクチャと運用オーバーヘッドをすべて排除しませんか? Akkaでは、すべてのアクター通信は非同期で非ブロッキングです。そして Akkaでは、SupervisorStrategies再試行、フォールバック、およびエスカレーションを達成するために存在します。これも要件である場合、実質的にあらゆるタイプのストアに持続するようにアクターを構成できます。 私のアプリがAkkaを使用している場合、JMS / AMQPブローカー(ActiveMQ、RabbitMQ、Kafkaなど)を写真に取り入れる必要がありますか?つまり、新しいAkkaベースのアプリが新しい JMS / AMQPブローカークラスターの導入を保証するユースケースはありますか?なぜですか? 唯一の議論は、おそらく私のAkkaアプリを別のシステムと統合する必要があるということです。ただし、その場合、Akka-Camelモジュールを使用すると、AkkaはCamelの統合機能の網羅的でほぼ無限のリスト(TCP、FTP、ZeroMQ、リストは延々と続く...)を活用できます。 考え?

4
インスタンス変数が多すぎるとコードが重複しますか?
パターンのリファクタリングによると: クラスが多くのことをしようとすると、多くの場合、インスタンス変数が多すぎます。クラスのインスタンス変数が多すぎる場合、複製されたコードはそれほど遅れることはありません。 インスタンス変数が多すぎるとコードが重複しますか?

3
コレクションを通常返す場所にストリームを返すのは正気ですか?
レガシーコードに関連付けられていないAPIを開発しているとき、結果を収集することで純粋にStreamsパイプラインで終了するメソッドを作成していることがよくあります。このように: ImmutableSet<T> deriveSomethingMeaningfulFromPrivateState() { return myPrivateThingies.stream() .map(this::ownerOfThing) .map(Owner::socialStatus) .filter(SocialStatus::isHeAFineMatey) .collect(MyCustomCollectors.toImmutableSet()); } さて、このクラスのほとんどのクライアントは通常、要素を検索してそれを反復処理するためにコレクション(この場合はImmutableSet)を必要としますが、一部のクライアントはその上にいくつかの操作をパイプできるようにストリームを持つことで利益を得ることができますコレクションから新しいストリームを取得する必要のないストリーム。したがって、ストリームを返すと、コレクションを持っている場合のオプションのスーパーセットがクライアントに提供されます(結局、常にcollect()ストリーム自体を使用できます: Stream<T> deriveSomethingMeaningfulFromPrivateState() { return myPrivateThingies.stream() .map(this::ownerOfthing) .map(Owner::socialStatus) .filter(SocialStatus::isHeAFineMatey); // No collect } このアプローチは、潜在的な欠陥が見当たらないため、試してみたいと思います。しかし、どのライブラリでもこのアプローチを見たことはありません(おそらく、Java 8の登場後にリリースされたライブラリが多くなかったためです)。既存のライブラリクラスは、通常、プライベート状態から何かを派生するときにコレクションを返します。 Java 8より前の自分がコレクションを返す場所にストリームを返すことにした場合に発生する可能性のある悪いことがありますか?または、私はここで私的状態から派生したすべてのものでアンチパターンの何かをしていますか?

3
例外-「何が起こった」対「何をすべきか」
例外を使用して、コードのコンシューマーが予期しない動作を便利な方法で処理できるようにします。通常、例外は「発生した」シナリオを中心に構築されます- FileNotFound(指定したファイルが見つかりませんでした)またはZeroDivisionError(1/0操作を実行できませんでした)。 消費者の予想される動作を指定する可能性がある場合はどうなりますか? たとえば、fetchHTTPリクエストを実行し、取得したデータを返すリソースがあるとします。そして、代わりのようなエラーServiceTemporaryUnavailableまたはRateLimitExceeded私達はちょうど引き上げるRetryableErrorそれだけで、要求を再試行する必要があり、特定の失敗を気にしないことを示唆している消費者を。そのため、基本的には呼び出し側にアクションを提案しています-「何をすべきか」。 消費者のすべてのユースケースを知っているわけではないため、これを頻繁に行うことはありません。しかし、それが発信者にとって最善のアクションコースを知っている特定のコンポーネントであると想像してください。
19 exceptions 

1
ネストされたREST URLと親ID、どちらが優れた設計ですか?
さて、2つのリソースがAlbumありSongます:と。APIは次のとおりです。 GET,POST /albums GET,POST /albums/:albumId GET,POST /albums/:albumId/songs GET,POST /albums/:albumId/songs/:songId 私たちはいくつかの歌が嫌いであることを知っていSusyます。たとえば、と呼ばれます。どこにsearch行動を起こすべきか? 別の質問。さて、今ではもっとリアルになっています。アルバム1を開き、すべての曲を読み込みます。JSオブジェクトを作成します。それぞれが曲データを保持しremove、次のようなメソッドはほとんどありませんupdate。 曲オブジェクトにはID、名前、およびものがありますが、どの親に属しているかについての手がかりはありません。これは、クエリによって曲のリストを取得するためです。私が間違っている? だから、私はいくつかの解決策を見ますが、私は本当に確信がありません。 親IDをオプションにします-get-parameterとして。私は現在このアプローチを使用していますが、butいアプローチだと感じています。 List,Create /songs?album=albumId Update,Delete /songs/:songId Get /songs/?name=susy # also, solution for first question ハイブリッド。OPTIONSメタデータを取得するためのクエリを実行するためにアルバムIDが必要なため、今では便利です。 List,Create /album/:albumId/songs Update,Delete /songs/:songId POST /songs/search # also, solution for first question 各リソースインスタンスで完全なURLを返します。APIは同じですが、次のような曲を取得します。 id: 5 name: 'Elegy' url: /albums/2/songs/5 このアプローチはHATEOASと呼ばれると聞きました。 だから...親IDを提供するには id: 5 …

4
「クラスの代わりにマップを使用してデータを表現する」-リッチヒッキー
でリッチヒッキーことで、このビデオ、Clojureの作成者、彼はJavaで行ったように、代わりにそれを表現するためにクラスを使用してのデータを表現するためにマップを使用することを助言します。単にマップとして表されている場合、APIユーザーはどのように入力キーを知ることができるのか、私はそれがどのように改善できるのか理解していません。 例: PersonAPI { Person addPerson(Person obj); Map<String, Object> addPerson(Map<String, Object> personMap); } 2番目の関数では、APIユーザーはどのようにして人を作成するための入力を知ることができますか?
19 java  design  class  clojure  map 


4
データの配置が面倒すぎる場合のテスト方法
私はパーサーを書いており、その一部として、Expander単一の複雑なステートメントを複数の単純なステートメントに「拡張」するクラスがあります。たとえば、これはこれを展開します: x = 2 + 3 * a に: tmp1 = 3 * a x = 2 + tmp1 今、私はこのクラスをテストする方法、具体的にはテストを配置する方法を考えています。入力構文ツリーを手動で作成できます。 var input = new AssignStatement( new Variable("x"), new BinaryExpression( new Constant(2), BinaryOperator.Plus, new BinaryExpression(new Constant(3), BinaryOperator.Multiply, new Variable("a")))); または、文字列として記述して解析することもできます。 var input = new Parser().ParseStatement("x = 2 + 3 * a"); …

4
Cで変数のデータ型を指定する必要があるのはなぜですか
通常、Cでは、変数宣言でデータの種類をコンピューターに伝える必要があります。たとえば、次のプログラムでは、2つの浮動小数点数XとYの合計を出力します。 #include<stdio.h> main() { float X=5.2; float Y=5.1; float Z; Z=Y+X; printf("%f",Z); } 変数Xの型をコンパイラーに伝える必要がありました。 コンパイラXはそれ自身で型を決定できませんか? はい、これを行うとできます: #define X 5.2 コンパイラーに次のようなタイプを伝えることなく、プログラムを作成できるようになりXました。 #include<stdio.h> #define X 5.2 main() { float Y=5.1; float Z; Z=Y+X; printf("%f",Z); } したがって、C言語には何らかの種類の機能があり、それを使用してデータのタイプを独自に判別できることがわかります。私の場合、それXはfloat型であると判断されました。 main()で何かを宣言するとき、なぜデータのタイプに言及しなければならないのですか?なぜコンパイラは、自身の中に変数のデータ型を判断することはできませんmain()、それはでませんよう#define。

2
コンストラクターで[Pure]を使用する場合
.NETのコードコントラクトについて学び、純粋なコンストラクターの概念を理解しようとしています。コードの契約ドキュメントの状態: コントラクト内で呼び出されるすべてのメソッドは純粋でなければなりません。つまり、既存の状態を更新してはなりません。純粋メソッドでは、純粋メソッドへのエントリ後に作成されたオブジェクトを変更できます。 そして、PureAttributeドキュメントの状態: 型またはメソッドが純粋であること、つまり、目に見える状態の変更を行わないことを示します。 メソッドに関してはこれらのステートメントを理解していますが、コンストラクターはどうですか?次のようなクラスがあったとします: public class Foo { public int Value { get; set; } public Foo(int value) { this.Value = value; } } このコンストラクターは明らかに新しいFooオブジェクトの状態に影響しますが、他の副作用はありません(たとえば、パラメーターを操作したり、非純粋なメソッドを呼び出したりしません)。これは候補者[Pure]ですか?[Pure]コンストラクターに属性を配置することの意義は何ですか?また、自分のコードでこれをいつ行う必要がありますか?

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