ソフトウェア工学

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

6
オブジェクトに無効な状態がある場合、ゲッターは例外をスローする必要がありますか?
一般的なOOPの問題だと思っていても、特にJavaでこの問題によく遭遇します。つまり、例外を発生させると、設計上の問題が明らかになります。 String nameフィールドとフィールドを持つクラスがあるとしString surnameます。 次に、これらのフィールドを使用して個人の完全な名前を作成し、ある種のドキュメント(請求書など)に表示します。 public void String name; public void String surname; public String getCompleteName() {return name + " " + surname;} public void displayCompleteNameOnInvoice() { String completeName = getCompleteName(); //do something with it.... } 次にdisplayCompleteNameOnInvoice、名前が割り当てられる前にが呼び出された場合にエラーをスローして、クラスの動作を強化したいと思います。いい考えですね。 getCompleteNameメソッドに例外発生コードを追加できます。しかし、この方法では、クラスユーザーとの「暗黙の」契約に違反しています。一般に、値が設定されていない場合、ゲッターは例外をスローすることは想定されていません。わかりました。これは単一のフィールドを返さないため、これは標準のゲッターではありませんが、ユーザーの観点からは区別が微妙すぎて考えられない場合があります。 または、の内部から例外をスローできdisplayCompleteNameOnInvoiceます。しかし、そうするためには、直接nameまたはsurnameフィールドをテストする必要がありますgetCompleteName。そうすることで、で表される抽象化に違反することになります。完全な名前を確認して作成するのは、このメソッドの責任です。他のデータに基づいて、場合によっては十分であると判断することさえできsurnameます。 だから、唯一の可能性は、メソッドのセマンティックを変更するようだgetCompleteNameとcomposeCompleteName、それをより「アクティブ」の行動と、例外をスローする能力を示唆しています。 これはより良い設計ソリューションですか?私はいつもシンプルさと正確さの間で最高のバランスを探しています。この問題の設計参照はありますか?

9
リファクタリングする前に単体テストを書く方法は?
「リファクタリング時にユニットテストをどのように機能させ続けるのですか?」などの同様の行に沿って質問に対するいくつかの回答を読みました。私の場合、私たちが持っているいくつかの標準をレビューし、それに合わせるプロジェクトを与えられたという点で、シナリオはわずかに異なります。現在、プロジェクトのテストはまったくありません! サービスレイヤーにDAOタイプのコードを混在させないなど、改善できたと思われる多くのことを特定しました。 リファクタリングする前に、既存のコードのテストを書くことは良い考えのように思えました。私に見える問題は、リファクタリングを行うと、特定のロジックが実行される場所を変更しているため、これらのテストが壊れ、テストが以前の構造を念頭に置いて書かれていることです(依存関係のモックなど) 私の場合、手続きを進める最善の方法は何でしょうか?私はリファクタリングされたコードの周りにテストを書きたいと思っていますが、望みの振る舞いを変える可能性のあるものを間違ってリファクタリングするリスクがあることを知っています。 これがリファクタリングであろうとリデザインであろうと、これらの用語の修正を理解できてうれしいです。現在、次のリファクタリングの定義に取り組んでいます。「リファクタリングでは、定義により、ソフトウェアの動作は変更されません方法を変えることができます。」だから、私はソフトウェアが何をするかを変えていません。 同様に、再設計と考えられるメソッドのシグネチャを変更する場合の議論を見ることができます。 簡単な例を示します MyDocumentService.java (現在) public class MyDocumentService { ... public List<Document> findAllDocuments() { DataResultSet rs = documentDAO.findAllDocuments(); List<Document> documents = new ArrayList<>(); for(DataObject do: rs.getRows()) { //get row data create new document add it to //documents list } return documents; } } MyDocumentService.java (何でもリファクタリング/再設計) public …

5
「文脈自由文法」という用語で「文脈自由」とはどういう意味ですか?
文脈自由文法(CFG)が何であるかを説明しようとする資料の量を考えると、そのような文法が「コンテキスト-自由"。そして、私の考えでは、誰もそうすることに成功していません。 私の質問は、なぜ文脈自由文法が文脈自由と呼ばれるのですか?「コンテキスト」とは何ですか?コンテキストは、現在分析されている構造を取り巻く他の言語構造である可能性があるという直感がありましたが、そうではないようです。誰でも正確な説明を提供できますか?

12
プログラムが特定の最小数のCPUコアを必要とするのはなぜですか?
N個未満のコアを持つCPUで実行すると正常に動作しないコード(またはコードではなく完全なソフトウェア)を作成することはできますか?明示的にチェックせず、意図的に失敗することなく: IF(noOfCores <4)その後、意図的に適切に実行されない 私はゲームの(Dragon Age:Inquisition)最小システム要件を調べていますが、それは最低4コアCPUを示しています。多くのプレイヤーは、2コアCPU および2つの物理コアと2つの論理コアを備えたIntel Core i3では動作しません。そして、それは計算能力の問題ではありません。 私の理解では、スレッドはOSによってCPUから完全に分離されています。 ただ物事をクリアするために: 私はありません「私はコードからCPUコアの数を調べると、意図的に失敗することはできますか?」尋ねます ...そのようなコードは意図的ではありません(計算能力を必要とせずに、プログラムを実行するためにより高価なCPUを購入せざるを得ません)。たとえば、コードが4つのスレッドを持ち、同じ物理コアで2つのスレッドが実行されると(システム情報を明示的に確認して意図的に失敗することなく)失敗するようにしています。 要するに、複数のコアから来る追加の計算能力を必要とせずに、複数のコアを必要とするソフトウェアが存在できるのでしょうか?N個の個別の物理コアが必要です。

6
イベントループは、ポーリングが最適化されたfor / whileループですか?
イベントループとは何かを理解しようとしています。多くの場合、イベントループでは、イベントが発生したことが通知されるまで何かをするという説明があります。その後、イベントを処理し、以前の操作を続行します。 上記の定義を例にマッピングします。イベントループで「リッスン」するサーバーがあり、ソケット接続が検出されると、そこからのデータが読み取られて表示され、その後サーバーは以前と同じようにリッスンを再開/開始します。 ただし、このイベントが発生し、「そのような」通知を受け取ることは、私にとって非常に重要です。あなたは言うことができる:「それはあなたがイベントリスナーを登録しなければならない「ちょうどそのような」ではない」しかし、イベントリスナーとは何か、何らかの理由で返されない関数です。イベントが発生したときに通知されるのを待っている独自のループですか?イベントリスナーもイベントリスナーを登録する必要がありますか?どこで終わりますか? イベントは作業するのに最適な抽象概念ですが、単なる抽象概念です。結局、ポーリングは避けられないと思います。おそらく私たちはコードでそれをしていませんが、下位レベル(プログラミング言語の実装またはOS)が私たちのためにそれをしています。 基本的には、次の擬似コードになります。このコードは、十分に低い場所で実行されているため、ビジー待機を発生させません。 while(True): do stuff check if event has happened (poll) do other stuff これはアイデア全体に対する私の理解であり、これが正しいかどうか聞きたいと思います。私は全体の考えが根本的に間違っていることを受け入れることに心を開いています。その場合、正しい説明が欲しいです。

10
「ユーザーは管理者かどうかを判断すべきではありません。特権またはセキュリティシステムが必要です。」
質問で使用されている例では、最小限のデータを関数に渡し、ユーザーが管理者であるかどうかを判断するための最良の方法に触れています。一般的な答えは次のとおりです。 user.isAdmin() これにより、コメントが何度か繰り返され、何度も投票されました。 ユーザーは、管理者であるかどうかを決定するべきではありません。特権またはセキュリティシステムが必要です。クラスに密接に結合されているからといって、それをそのクラスの一部にすることは良い考えではありません。 私は答えた、 ユーザーは何も決定していません。ユーザーオブジェクト/テーブルには、各ユーザーに関するデータが格納されます。実際のユーザーは、自分に関するすべてを変更することはできません。 しかし、これは生産的ではありませんでした。明らかに、遠近法には根本的な違いがあり、それがコミュニケーションを難しくしています。誰かがuser.isAdmin()が悪い理由を説明し、それが「正しく」行われたように見えるものの簡単なスケッチを描くことができますか? 本当に、私はそれが保護するシステムからセキュリティを分離することの利点を見ることはできません。セキュリティに関するテキストには、セキュリティを最初からシステムに組み込む必要があり、開発、展開、保守、さらには寿命のあらゆる段階で考慮する必要があると書かれています。側面にボルトで固定できるものではありません。しかし、このコメントに対するこれまでの17の賛成票は、私が重要な何かを見逃していると言っています。

10
ジュニアプログラマーは、シニアプログラマーのプロジェクトにコードレビューアとして関与すべきですか?
私のチームメンバーの1人であるジュニアプログラマーは、彼の経験レベルに対して優れたプログラミングスキルを持っています。 また、コードのレビュー中に、間違いを指摘するのではなく、学習を重視することを信じています。 しかし、若いプログラマーは、より上級のプログラマーのコードレビューに関与すべきでしょうか?または、コードレビューには、対応する経験を持つプログラマーのみが参加する必要がありますか?

12
ボーイスカウトルールと日和見的リファクタリングとコードレビューの調整
私はボーイスカウトルールを大いに信じています。 オリジナルの作者が誰であっても、モジュールを改善するためにどんなに小さな努力をしたとしても、結果はどうなるでしょうか?すべてがその単純なルールに従っており、ソフトウェアシステムの容赦ない劣化の終わりが見えますが、代わりに、システムが進化するにつれて徐々に改善されていきます。自分の小さな部分を気遣うだけの個人よりも。 私はまた、日和見的リファクタリングの関連するアイデアを強く信じています。 いくつかのスケジュールされたリファクタリングの努力のための場所がありますが、私は、いつでもどこでもコードをクリーンアップする必要があるとき、誰によってでも行われる日和見的な活動としてリファクタリングを奨励することを好みます。これが意味することは、誰かがそれほど明確でないコードを見たときはいつでも、すぐにそれを修正する機会をとるべきだということです-少なくとも数分以内に 特に、リファクタリングの記事からの次の抜粋に注意してください。 私は日和見的リファクタリングの摩擦を引き起こす開発慣行には警戒しています...私の感覚では、ほとんどのチームは十分なリファクタリングを行っていないので、人々がそれを行わないよう注意を払うことが重要です。これを洗い流すのを助けるために、小さなリファクタリングを行うことを思いとどまるときはいつでも気をつけてください。確かに1、2分しかかかりません。そのような障壁は、会話を促す匂いです。そのため、落胆のメモを取り、チームに報告してください。少なくとも、次の回顧展で議論する必要があります。 私が働いているところでは、大きな摩擦を引き起こす開発プラクティスが1つあります。それは、コードレビュー(CR)です。「割り当て」の範囲にないものを変更するたびに、レビュー担当者に非難され、変更をレビューしにくくします。これは、リファクタリングが関係する場合に特に当てはまります。「行ごと」の比較比較が困難になるためです。このアプローチはここでの標準です。つまり、日和見的リファクタリングはめったに行われず、「計画された」リファクタリング(通常は少なすぎる、遅すぎる)が行われます。 私は、メリットはそれだけの価値があり、3人のレビュアーが少し一生懸命に働くと主張しています(変更された行の狭い範囲を見るのではなく、実際に前後のコードを理解するために-レビュー自体はそれだけで良いでしょう) )コードを読んで保守する次の100人の開発者が恩恵を受けるように。この論点をレビューアーに提示すると、同じCRにない限り、リファクタリングに問題がないと彼らは言います。しかし、私はこれが神話だと主張しています: (1)ほとんどの場合、課題の最中に何をどのようにリファクタリングしたいかを認識するだけです。マーティン・ファウラーが言うように: 機能を追加すると、追加するコードに既存のコードとの重複が含まれていることに気付くため、既存のコードをリファクタリングしてクリーンアップする必要があります...何か機能するかもしれませんが、既存のクラスとの相互作用が変更された場合に優れています。自分が完了したと考える前に、その機会にそれを行ってください。 (2)実行するはずのない「リファクタリング」CRをリリースすることを好む人はいません。CRには一定のオーバーヘッドがあり、マネージャーはリファクタリングに「時間を浪費する」ことを望んでいません。行うべき変更にバンドルされている場合、この問題は最小限に抑えられます。 問題はResharperによって悪化します。変更に追加する各ファイル(および最終的にどのファイルが変更されるか正確に知ることはできません)には、通常、エラーと提案が散らばっています。修正。 最終的な結果は、ひどいコードが表示されることであり、そのまま残します。皮肉なことに、このようなコードを修正しても私の地位が向上するだけでなく、実際にはそれらを下げて、仕事をする代わりに誰も気にしないものを修正する時間を無駄にする「焦点のない」男として描く 私は本当に悪いコードを軽deし、それを見て我慢できず、私のメソッドからそれを呼び出すことができないので、私はそれについて悪いと感じています! この状況をどのように解決できるかについての考えはありますか?

6
バグの再オープンと新規
バグが開かれ、修正され、検証され、閉じられました。1か月後、回帰なしに数回繰り返した後、次のバージョンで再び現れました。 バグの特性が同じであれば、既存のバグID を再度開くか、閉じたバグへのリンクを含む新しい IDを開きますか?

3
再帰とコアカーソルの違いは何ですか?
これらの違いは何ですか? 再帰 コアカージョン ウィキペディアでは、これらの用語を説明する情報はほとんどなく、明確なコードもありません。 これらの用語を説明する非常に簡単な例は何ですか? corecursionはどのように再帰の二重ですか? 古典的なcorecusiveアルゴリズムはありますか?

7
ユニットテストには依存性注入が不可欠ですか?
単体テストに依存性注入(DI)の使用は不可欠ですか? テストできるようにコードを分離する別の方法は考えられません。また、私が今まで見たすべての例では、このパターンを使用しています。それは唯一の実行可能なオプションであるか、または他の選択肢があるからでしょうか?

5
プログラマー向けのオーディオブック?[閉まっている]
私は毎日2時間通勤しているプログラマーです。その時間の一部をソフトウェア開発に関するオーディオブックで埋めたいと思います。私がより良いプログラマーになるのに役立つオーディオブックをいただければ幸いです。ここでは、デザインパターンとコンピューティング履歴に関するノンフィクションに関する本が役立つと考えていますが、私は何にでもオープンです。 私は車でこれを聞いていることを念頭に置いて、私が聞くことができる最高のオーディオブックは何ですか? 編集:多くの人々はポッドキャストも提案しています。これはありがたいことですが、ポッドキャストは有限量のデータとしてではなく、常に到着するデータストリームに到着するため、これらの異なるコンテンツストリームをすべてジャグリングする方法も評価されます。 より具体的に言うと、通勤車両にはMP3 CDプレーヤー、MP3ファイル用のUSB入力、およびAUX入力があります。AUX入力にプラグインできるAndroidおよびwebOSデバイスを所有しています。
55 books 

8
なぜ適切に意味論的にマークアップする必要があるのでしょうか?
私は見た目や感じが好きなので、可能な限り意味的にマークアップしようとしますが、他の素晴らしい利点を知っているからではありません。私の質問のポイントは、他の人を教育できるようにすることです さて、私は多くの記事やチュートリアルを見てきましたが、「セマンティックな方法でこれをマークアップしましょう」ということがよくあります。 しかし、奇妙な考えが私に来ました、なぜですか? なぜ正しいセマンティックな意味を伝える特定の要素に煩わされる必要がある(またはしたい)のでしょうか?具体的には、私のような、新しいHTML5要素を参照しています<time>、<output>または<address>。特に、ページが「機能する」場合(すべてのブラウザで適切に表示されます)。 なぜ、<time>またはのような要素を使用したいのでしょうか?<address><span> こういったいわゆるベストプラクティスに従わない(非常に人気のある)Webサイト(このサイトを含む)が多数あるので、これを求めています。
55 html  html5  semantics  markup 


2
Google Web Toolkitを使用しない場合 [閉まっている]
社内の主要なWebアプリ開発プロジェクトでGWTを使用することを検討しています。つまり、私の目での主な利点は、Javaスタックへのクロスコンパイルであり、(少なくとも理論的には)技術スタックのサイズを1つ削減するのに役立ちます。 ただし、(ほとんどの開発者と同様に)以前に焼かれたことがありますが、特定の問題ドメイン内での使用を妨げる、または制限するGWTの問題で実際に使用したプログラマーから聞いてみたいと思います。 GWTの使用に反対する論拠は何ですか?
55 java  javascript  ajax  gwt 

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