ソフトウェア工学

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

8
順次コレクションは、インデックス0またはインデックス1で開始する必要がありますか?
複数のチャネルを持つデバイスのオブジェクトモデルを作成しています。クライアントと私の間で使用される名詞があるChannelとChannelSet。(「セット」は順序付けられており、適切なセットがそうではないため、意味的に正確ではありません。しかし、それは別の時代の問題です。) C#を使用しています。以下に使用例を示しChannelSetます。 // load a 5-channel ChannelSet ChannelSet channels = ChannelSetFactory.FromFile("some_5_channel_set.json"); Console.Write(channels.Count); // -> 5 foreach (Channel channel in channels) { Console.Write(channel.Average); Console.Write(", "); } // -> 0.3, 0.3, 0.9, 0.1, 0.2 すべてがダンディです。 ただし、クライアントはプログラマーではないため、ゼロインデックスによって完全に混乱します。最初のチャネルはチャネル1です。しかし、C#との一貫性を保つために、ChannelSetインデックスをゼロから維持したいと思います。 これにより、開発チームとクライアントが相互作用するときに、いくつかの切断が確実に発生します。しかし、さらに悪いことに、これがコードベース内でどのように処理されるかに矛盾があると、潜在的な問題になります。たとえば、次のUI画面では、エンドユーザー(1インデックス作成の観点から考える)がチャネル13を編集しています。 そのSaveボタンは、最終的にいくつかのコードになります。ChannelSetインデックスが1の場合: channels.GetChannel(13).SomeProperty = newValue; // notice: 13 または、インデックスがゼロの場合: channels.GetChannel(12).SomeProperty = newValue; // notice: 12 私はこれをどのように扱うか本当によくわかりません。私は、順序付けられた整数インデックス付きのもの(ChannelSet)を、C#ユニバースの他のすべての配列およびリストインターフェイスと一貫性を保つこと(ゼロインデックス付けChannelSet)をお勧めします。しかし、その後、UIとバックエンドの間のすべてのコードには翻訳(1を引く)が必要になります。そして、誰もが陰湿で一般的なオフバイワンエラーが既にどの程度存在するかを知っています。 …


1
貢献者にgithubでプルリクエストのリベースを依頼するのは正しいですか?
私は比較的人気のあるgithubリポジトリを維持しています。 プルリクエストがマージに適している場合、通常、マージする前に作成者に単一のコミットにリベースするように依頼します(特に複数の小さな編集がある場合)。 これは良いGitプラクティスですか?これは許容できる/標準のGitHubエチケットですか? いくつかの利点: コミットログにきれいなコミット履歴があります 自分でコミットを変更する必要はありません 作業の一部を委任します 考えられる欠点: これが良いエチケットかどうかわかりません これが良いGitプラクティスかどうかわかりません 私は通常、すでにいくつかの他の変更を求めています-これはもう1つであり、貢献者を落胆させたくありません。
25 github  etiquette 

1
Reactive Extensionsを使用した非同期ネットワークプログラミング
この質問は、Software Engineering Stack Exchangeで回答できるため、Code Review Stack Exchangeから移行されました。 5年前に移行され ました。 何socket年か前に(多かれ少なかれ)「低レベル」非同期プログラミング(イベントベースの非同期パターン(EAP)方式)を行い、最近TcpListener(非同期プログラミングモデル(APM))に「上」に移動した後、async/await(Task-based Asynchronous Pattern (TAP))に移動しようとしています だから私は考えていた。私の問題のドメインによりぴったりと合うかもしれないのでRX、なぜ行ってみてください(Reactive Extensions)。 多くのクライアントがTcpを介してアプリケーションに接続し、双方向(非同期)通信を開始する多くのコードを作成する必要があります。クライアントまたはサーバーはいつでもメッセージを送信する必要があると判断する場合があります。そのため、これは従来のrequest/responseセットアップではなく、リアルタイムで双方向の「回線」であり、両者が自由に送信できます、いつでも好きなときに。(これを説明するためのまともな名前を持っている人がいれば、それを聞いてうれしいです!)。 「プロトコル」はアプリケーションごとに異なります(私の質問にはあまり関係ありません)。ただし、最初の質問があります。 1つの「サーバー」のみが実行されていることを考えると、多くの(通常は数千の)接続(クライアントなど)を追跡する必要があります。州など、どのアプローチを好むでしょうか?EAP / TAP / APM?RXもオプションと見なされますか?そうでない場合、なぜですか? だから、a)それは要求/応答プロトコルではないので、非同期を動作させる必要があるので、スレッド/クライアントを「メッセージ待ち」ブロッキング呼び出しまたは「メッセージ送信」ブロッキング呼び出し(ただし、送信がそのクライアントのみをブロックできます(私はそれと一緒に暮らすことができます)およびb)多くの同時接続を処理する必要があります。ブロッキング呼び出しを使用してこれを(確実に)行う方法はありません。 私のアプリケーションのほとんどはVoiP関連です。SIP cientsからのSIPメッセージでも、FreeSwitch / OpenSIPSなどのアプリケーションからのPBX(関連)メッセージングでも、最も簡単な形式では、多くの「チャット」クライアントを処理しようとする「チャット」サーバーを想像できます。ほとんどのプロトコルはテキストベース(ASCII)です。 したがって、前述の手法のさまざまな順列を実装した後、単純にインスタンス化できるオブジェクトを作成して作業を簡素化し、IPEndpoint聞きたいものを伝え、興味のあることが起こったらいつでも教えてもらいたい(通常はイベントを使用するため、一部のEAPは通常、他の2つの手法と混合されます)。クラスは、プロトコルを「理解」しようとする必要はありません。単に着信/発信文字列を処理する必要があります。したがって、RXに注目して(最終的に)作業を簡素化することを期待して、ゼロから新しい「フィドル」を作成しました。 using System; using System.Collections.Concurrent; using System.Net; using System.Net.Sockets; using System.Reactive.Linq; using System.Text; class Program { static void Main(string[] args) { var f …
25 c#  .net  tcp 

12
「try…catch…finally」構文の「finally」部分は必要ですか?
一部の言語(C ++や初期バージョンのPHPなど)はfinally、try ... catch ... finally構成要素の一部をサポートしていません。でfinally、これまで必要?その中のコードは常に実行されるため、なぜ句のtry ... catchないブロックの後にそのコードを配置しない/しないのfinallyですか?なぜ使用するのですか?(私は、使用する/使用しない理由/動機を探しfinallyていますが、「キャッチ」をやめる理由や、そうすることが合法である理由ではありません。)

7
主キーがビジネスドメインの一部ではないという事実に対処する
ほとんどすべての状況で、主キーはビジネスドメインの一部ではありません。確かに、一意のインデックスを持つユーザー向けの重要なオブジェクト(UserNameユーザーまたはOrderNumber注文用)がいくつかある場合もありますが、ほとんどの場合、1つまたは複数の値によってドメインオブジェクトを明確に識別する必要はありません管理ユーザー。これらの例外的な場合でも、特にグローバル一意識別子(GUID)を使用している場合は、主キー自体を公開するのではなく、代替キーを使用したい、または使用したいでしょう。 したがって、ドメイン駆動型設計の私の理解が正確である場合、主キーを公開する必要はなく、したがって公開すべきではありません。彼らはくて、私のスタイルをcr屈にします。しかし、ドメインモデルに主キーを含めないことを選択した場合、結果が生じます。 単純に、ドメインモデルの組み合わせから排他的に派生するデータ転送オブジェクト(DTO)には主キーがありません 着信DTOには主キーはありません したがって、ドメインモデルで本当に純粋でプライマリキーを削除する場合、そのプライマリキーの一意のインデックスに関してすべての要求を処理できるように準備する必要があると言っても安全ですか? 別の言い方をすれば、ドメインモデルでPKを削除した後に特定のオブジェクトを識別するための正しいアプローチは、次のソリューションのどれですか 他の属性で処理する必要があるオブジェクトを識別できること DTOで主キーを取得します。つまり、永続性からドメインへのマッピング時にPKを削除し、ドメインからDTOへのマッピング時にPKを再結合しますか? 編集:これを具体的にしましょう。 私のドメインモデルがあると言うVoIPProviderなどの分野が含まれName、Description、URL、などのような参照ProviderType、PhysicalAddressおよびを、Transactions。 ここで、特権ユーザーがVoIPProviders を管理できるWebサービスを構築したいとします。 おそらく、この場合、ユーザーフレンドリーなIDは役に立ちません。結局のところ、VoIPプロバイダーは、コンピューターの意味で名前が明確になり、ビジネス上の理由から人間の意味でも十分に区別される傾向がある企業です。それで、ユニークVoIPProviderは完全に決定されると言うことで十分かもしれません(Name, URL)。PUT api/providers/voip特権ユーザーがVoIPプロバイダーを更新できるようにする方法が必要だとしましょう。は、を送信しますVoIPProviderDTO。これには、からのすべてのフィールドではなく、多くのフィールドが含まれVoIPProviderます。しかし、私は彼らの心を読むことができず、彼らはまだ私たちが話しているプロバイダーを教えてくれる必要があります。 私は2つ(おそらく3つ)のオプションを持っているようです: ドメインモデルにプライマリキーまたは代替キーを含めてDTOに送信します。逆も同様です。 次のような一意のインデックスを使用して、関心のあるプロバイダーを特定します。 (Name, Url) 永続層に関する実装の詳細を公開しない方法で、永続層、ドメイン、およびDTOの間を常にマッピングできる何らかの中間オブジェクトを導入します。たとえば、ドメインからDTOに移動するときにメモリ内の一時識別子を導入し、

11
Cのvoidがvoidではないのはなぜですか?
JavaやC#などの厳密に型指定された言語では、メソッドの戻り値型としてvoid(またはVoid)を意味するようです: このメソッドは何も返しません。なし。返品不可。このメソッドからは何も受け取りません。 本当に奇妙なのは、Cではvoid、戻り値の型として、またはメソッドのパラメーターの型としても、 それは本当に何でもありえます。調べるには、ソースコードを読む必要があります。がんばろう。それがポインタである場合、あなたは何をしているかを本当に知っている必要があります。 Cの次の例を検討してください。 void describe(void *thing) { Object *obj = thing; printf("%s.\n", obj->description); } void *move(void *location, Direction direction) { void *next = NULL; // logic! return next; } 明らかに、2番目のメソッドはポインターを返しますが、これは定義上何でもかまいません。 CはJavaやC#よりも古いので、なぜこれらの言語はvoid「何も」を意味するものとして採用したのに、Cは「何も何も(ポインターの場合)」として使用しませんでしたか?
25 c  pointers 

4
Git Stashをワークフローとして使用するのはアンチパターンですか?
最近、私と私のチームがGitをどのように使用し、ワークフローがどのように機能するかを調べてきました。現在、機能ブランチワークフローを使用していますが、うまく機能しているようです。 また、私たちのチームの何人かの個人がgit stashに基づくワークフローを使用しているのを見ました。ワークフローは次のようになります。 メインブランチで作業する(などmaster) 進行中にコミットする 変更を取得するか、ブランチを切り替える必要がある場合は、コミットされていない変更をスタッシュにプッシュします 更新が完了したら、変更をスタッシュからポップします。 このワークフローは、機能ブランチワークフローの代わりに使用されることに言及する必要があります。ここでの開発者は、ブランチを取得して作業する代わりに、単一のブランチでのみ作業し、適切と思われるスタックからプッシュ/ポップします。 実際、これは素晴らしいワークフローではないと思うので、この方法でgit stashを使用するよりも分岐が適切です。git stashの価値は緊急操作として見ることができますが、毎日の通常のワークフローで使用することはできません。 git stashを定期的に使用することはアンチパターンと見なされますか?その場合、発生する可能性のある特定の問題は何ですか?そうでない場合、利点は何ですか?

3
C#の宣言型と同じ名前をプロパティ/メンバーに付けるのは悪い習慣ですか?
たとえば、次のようなクラス: class Dog { } //never mind that there's nothing in it... そして、次のようなプロパティ: Dog Dog { get; set; } もっと想像力に富んだ名前が思いつかない場合は、次を使用する必要があると言われました。 Dog DogObject { get; set; } これらの名前をより良くする方法についての考えはありますか?
25 c#  naming  properties 

4
C以外のC ++リンケージ言語?
C ++言語では、1つのソースファイルでC ++とCの両方を混在させることができます。例えば、 extern "C" { struct bar { /* ... */ } } C ++またはC以外の「リンケージ言語」をサポートしたことがありますか?例extern "Pascal"またはextern "Haskell"

4
Javaが一部のクラスでカプセル化を使用しないのはなぜですか?
私の質問はSystem.inとSystem.outクラスに関連しています(標準ライブラリにあるようなものがあるかもしれません)。何故ですか?それはOOPの悪い習慣ではありませんか?次のように使用しないでください:System.getIn()およびSystem.getOut()?私はいつもこの質問をしてきました。ここで良い答えが見つかることを望みます。

10
コンストラクタなしで生きることはできますか?
何らかの理由で、すべてのオブジェクトがこの方法で作成されるとしましょう$ obj = CLASS :: getInstance()。次に、セッターを使用して依存関係を注入し、$ obj-> initInstance()を使用して初期化を開始します。コンストラクターをまったく使用しない場合、解決できない実際のトラブルや状況はありますか? PSこの方法でオブジェクトを作成する理由は、いくつかのルールに従ってgetInstance()内のクラスを置き換えることができるからです。 私はPHPで働いています、それが問題なら

3
JSON APIからHTMLを返しても大丈夫ですか?
現在のプロジェクトでは、JSONのみをサポートするものとして文書化されている、新しく作成されたRESTful APIの使用を伴うサービスの実装を担当しています。 クライアントは、一貫して「application / json」のacceptヘッダーと「application / json」のcontent-typeで要求を行います。ただし、一部のエンドポイントは、HTMLのコンテンツタイプ、さらにはHTML本文で応答を送信します。私にとってこれは明らかに間違ったアプローチであり、正当化することはできません。 プロジェクト全体を通して、この同じプラクティスが2つの異なるベンダーと2つの異なるサービスに適用されています。サービスを変更する必要がある理由を正当化する必要があることに気づきました。ベンダーは、クライアントはこれに対処する必要があると述べており、デフォルトの「箱から出して」これに対処しないため、選択したRESTライブラリでさえ疑問視されています(RestEasy)。 これはフラストレーションの大きなポイントでした。私の主張を裏付ける多くの参考文献を見つけることができません。これは、それが非常に明白であるので、ポイントが議論の余地があるからだと思います。 問題は、何かが足りないということですか?私はこれについて熱心ですか?このシナリオでcontent-typeのapplication / jsonを持たないJSON APIを使用しても大丈夫ですか?参照をいただければ幸いです。商業的な観点からこの状況をどのように解決しますか?

5
共有コーディングパラダイムを使用するという点で、言語Yでプログラムを記述しているように、言語Xで何かを記述するのがなぜ悪いのか[非公開]
閉じた。この質問はより集中する必要があります。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集するだけで1つの問題に焦点を当てるように質問を更新します。 5年前に閉鎖されました。 しばらく前に、私はC ++で書かれた何かについてのSOの質問をし、代わりに手で問題に答えを得るための、コメントは、私はそれがあることが示された場合でも、私のコーディングスタイル上のすべての大騒ぎWIPのコードの一部そして、ベースケースを実行させたときに、後でクリーンアップするつもりだった。(私は非常に多くの票を集めたので、私はSOの担当者がすでにほぼ最悪であるため、質問を撤回することにしました) なぜ人々は「あなたは初心者だ、自分で性交をする」という厳しいラインを採用するのだろうと思いました。私は、あたかもJavaであるかのようにC ++を書いていると非難されていました。私が理解できない何か、それでも私を困惑させます。 私は、間隔を置いてではあるが、何年もの間、かなりの数のOOP言語でプログラミングを行ってきました。使用可能なライブラリと、手元のジョブに最適な実行環境の観点から、使用する言語を選択します。私はOOPコードにデザインパターンを採用していますが、パターンの使用は適切であり、オブジェクト指向では賢明であると確信しています。私はOOPツールボックスを理解していますが、コーディングの知恵を示すためにきちんとしたトリックを使用するのではなく、本当に必要だと思うときにのみツールを使用することを選択します。(私が知っているのは一流ではありませんが、n00bレベルでもないと思います)。 1行書く前にコードを設計します。テストを定義するために、特定のクラスの目標と、クラスが順守しなければならないテスト基準をリストします。シーケンス図を作成してコードを書く方が簡単なので、インターフェイスが明らかになった後にテストを書くことにしました。 質問で投稿したコードの一部で、スマートポインターを使用する代わりに、ポインターを使用していることを認めなければなりません。できる限りRAIIを使用しています。適切なRAIIとは、nullpointersに対する保護を意味しますが、徐々に作業を進めます。それは進行中の作業であり、後でクリーンアップするつもりでした。この働き方は強く非難されました。 私の見解では、基本ケースが実行可能な思考方法であるかどうかを確認できるように、最初に実際の例を用意する必要があります。また、ベースケースが証明された後、コードのクリーンアップはアジャイルのリファクタリングフェーズの典型的なことだと思います。私はゆっくりとCxx標準を取得していますが、実稼働コードでまだ習得していない概念を使用するリスクを負うのではなく、理解しているものを使用することを好みます。たまに新しいものを試すこともありますが、通常はその目的のために、私が脇に置いているプレイプロジェクトでやっています。 [編集]質問を始める前に、gnatの提案[1]が検索に表示されなかったことを明確にしたいと思います。ただし、彼の提案は質問の1つの側面をカバーしていますが、彼がリンクした質問は私の質問の核心ではなく、その一部にすぎません。私の質問は、自分のコーディングスタイルに対する応答と、さまざまなコーディングスタイルと(見かけの)レベルのスキルを処理する専門的な側面についてです。SOについての以前の質問と、それが適切な事例としての回答です。[/編集] 質問は次のとおりです。あなたのコーディングスタイルを使用していない人をsc笑するのはなぜですか。 手元にある問題/下位区分は次のとおりです。 リファクタリングにより後で堅牢になった場合、プロトタイプの状況でエラーが発生しやすいコードを使用するのはなぜプログラミングの悪い習慣になるのでしょうか? C ++で書かれたプログラムは、Javaで書かれたようにどのようにできますか?何が悪いプログラムになっているのですか(現在のスタイルの意図と改善する予定の作業を示したと考えていますか?) 特定のプログラミングパラダイム(たとえば、OOP / DP)で使用される構造を使用することを選択した場合、どのように悪い専門家になりますか? [1] 高速でバグのあるものを開発し、エラーを修正するか、コードの各行に注意して遅くしますか?

1
DOMに関するいくつかの説明
私はDOMを理解しようとしてきましたが、それが何であるかについてはかなりのアイデアを持っていますが、特定できないアイデアがあります。DOMが何であると思うかをリストし、私の質問はインラインになります。 DOMは、Webページの完全にオブジェクト指向の表現です。W3C DOM標準は、最新のブラウザのほとんどに実装されているDOMの基礎を形成しています。 それでは、DOMはXML / HTMLドキュメントがオブジェクトモデルとしてどのように表現されるかについて話しますか? DOMは、ドキュメントをツリーまたはグローブとして実装する必要があることを指定していません。また、オブジェクト間の関係を実装する方法も指定していません。 ドキュメントは他のどのように表現できますか? このようなことをするとき- document.write('welcome to my home page!'); ドキュメントオブジェクトはDOMによって提供されます。書き込みメソッドは、DOMによってJavaScriptに公開されるインターフェイスです。 オブジェクトとそのメソッドは、DOMパーサーによってJavaScriptオブジェクトとして作成され、JavaScriptエンジンに提示されますか?または、DOM解析エンジン内のオブジェクトとメソッドは、独自のネイティブ言語ですか?JavaScriptエンジンにさらされていますか?その場合、JavaScriptから母国語への翻訳の責任は何ですか? 言語バインディングとは何ですか? 言語バインディングは、DOM仕様の各インターフェイスを実装する、問題の言語固有のオブジェクトのセットです。 開発者は、DOM仕様のIDL(インターフェイス定義言語)に従うだけで、DOMから自分の言語への言語バインディングを作成できます。 たとえば、DOM解析エンジンがC ++などで実装されている場合、IDLに従って言語バインディングを作成するとき、特定の言語、つまりDOM解析エンジンが構築されているC ++でオブジェクトを作成するだけです。
25 javascript  dom 

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