ソフトウェア工学

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

8
オブジェクト指向クラスの設計
オブジェクト指向の優れたクラス設計について疑問に思っていました。特に、これらのオプションを決定するのに苦労しています。 静的対インスタンスメソッド パラメータまたは戻り値のないメソッド vs パラメータおよび戻り値のあるメソッド オーバーラップする対の異なる方法で機能 民間対公共方法 例1: この実装では、戻り値やパラメーターを持たず、機能が重複しないインスタンスメソッドを使用します。すべてのメソッドはpublic XmlReader reader = new XmlReader(url); reader.openUrl(); reader.readXml(); Document result = reader.getDocument(); 例2: この実装では、戻り値とパラメータを備えた静的メソッドを使用し、重複する機能とプライベートメソッドを使用します。 Document result = XmlReader.readXml(url); 例1では、すべてのメソッドがパブリックインスタンスであるため、ユニットテストが簡単になります。すべてのメソッドは異なりますが、readXml()はopenUrl()に依存しているため、openUrl()を最初に呼び出す必要があります。すべてのデータはインスタンスフィールドで宣言されるため、コンストラクターとアクセサーを除き、どのメソッドにも戻り値やパラメーターはありません。 例2では、​​1つのメソッドのみがパブリックであり、残りはプライベートスタティックであるため、ユニットテストが困難です。readXml()がopenUrl()を呼び出すという点で、メソッドは重複しています。フィールドはありません。すべてのデータはメソッドのパラメーターとして渡され、結果はすぐに返されます。 適切なオブジェクト指向プログラミングを行うには、どの原則に従うべきですか?

9
継承が間違っている
良い継承モデルが下り坂になっているコードがいくつかあり、それを修正する理由と方法を理解しようとしています。基本的に、次のようなZoo階層があるとします。 class Animal class Parrot : Animal class Elephant : Animal class Cow : Animal 等 eat()、run()などのメソッドがあり、すべてが適切です。それからある日誰かがやって来て言う-私たちのCageBuilderクラスはうまく機能し、animal.weight()とanimal.height()を使用しますが、新しいアフリカバイソンは強すぎて壁を砕くことができるので、追加しますAnimalクラスのもう1つのプロパティ-isAfricanBizon()で、マテリアルを選択するときにそれを使用し、AfricanBizonクラスに対してのみオーバーライドします。次の人が来て、似たようなことをします。次に、基本クラスへの階層のサブセットに固有のこれらすべてのプロパティがあることを知っています。 そのようなコードを改善/リファクタリングする良い方法は何ですか?ここでの1つの代替方法は、dynamic_castsを使用して型をチェックすることですが、呼び出し元を混乱させ、あらゆる場所にif-then-elseを追加します。ここでは、より具体的なインターフェイスを使用できますが、基本クラス参照のみを使用している場合は、あまり役に立ちません。他の提案はありますか?例? ありがとう!

7
パフォーマンスの問題と見なされるまでに画面が表示されるまでにどれくらい時間がかかりますか?
さまざまな画面を持つWindowsアプリケーションの開発に携わっています。そのうちの1つは、画面がロードされていることを示すスピナーやその他の表示なしで表示されるのに10秒かかります。私はこれを深刻なパフォーマンスの問題だと考えていますが、心配しているのは私だけだと思われます。 私は熱心ですか?画面が表示されるのを待つ許容時間はどれくらいですか?

5
何が新しいプログラミング言語の採用を促進するのか、しないのか?[閉まっている]
閉じた。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して事実と引用で答えられるように質問を更新してください。 3年前に閉店しました。 新しいプログラミング言語が主流に採用され、他の言語が比較的ニッチのままである理由に焦点を当てたいと思います。特定のユースケース、後方互換性、またはいくつかの新機能、単純または複雑な実装の難しさなどについて知りたいです。特定の例をいただければ幸いですが、ここで「主流」または「ニッチ」の正確な定義に追いつくことは避けましょう。

4
デイワンバグという用語の意味は何ですか?
最近、メールチェーンでこの用語に出会いました。Googleはそこ用語である私に語ったゼロデイのバグは、およびMicrosoftとAdobeがフロントランナーであることを:) 初日バグなどの用語はありますか?それはどういう意味ですか?
12 terminology  bug 

11
若くて死にかけているプロジェクトを救うには?
潜在的なトラブルに巻き込まれたくないので、これを匿名で投稿しています。 私には大きな問題があります。 私は最近、1歳未満のチームに参加しました。私はプロジェクトが始まってから一ヶ月間ここにいました。会社の構造は次のようになります。 所有者(技術者以外) プロジェクトマネージャー(技術者以外) 主任開発者(技術的ですが、それは苦手です) このプロジェクトは、ASP.Netを使用したWebサイトであり、主な開発者が恐ろしいアーキテクチャを設計しました。私の言葉に耳を傾ける必要がありますが、基本的に、Webページを構築するために必要な方法は、デバッグモードでVPNを介して1つのWebページで3分以上の読み込み時間を与えることです。 他の同僚が、実際の開発よりもページの読み込みを待つことに多くの時間を費やすことに同意するところまで、スパイラルが発生しています。 今、大きな問題はこれです。プロジェクトマネージャーはテクノロジーを知らず、それを認めています。彼は、主任開発者がアプリケーションアーキテクチャについて正しい選択をすることを信頼していると明確に述べています。 チームの誰も所有者の意見が何であるかを知りませんが、誰もがこの経済(特に私自身)で波を起こすことを恐れています。 あなたならどうしますか?

5
ホストされるスクリプトの長所と短所[非公開]
閉じた。この質問はより集中する必要があります。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集するだけで1つの問題に焦点を当てるように質問を更新します。 5年前に閉鎖されました。 一部の開発者がホストされたスクリプトを使用してライブラリをリンクするのを見てきました。 cdn.jquerytools.org 一例です。 また、ホストされたスクリプトリンクがハイジャックされたことに不満を言う人もいます。 ホストされたスクリプトを実際に使用するのは安全ですか?スクリプトは自動的に更新されますか?たとえば、jQuery 5が6になった場合、バージョン6が自動的に取得されますか、それともリンクを更新する必要がありますか? また、Googleにはホスティング用のこれらのスクリプトセットが多数あることがわかります。 長所と短所は何ですか?
12 jquery 

4
大声でコードを読み取るための基準?
誰でも、どの言語でもコードを読み上げるための標準を定義していますか?これは、視覚障害者向けのスクリーンリーダーなどのソフトウェアにとって重要だと思います。この種のことは、コードを誰かと話し合ったり、グループでレビューしたり、クラスを教えるときにも起こります。 C言語ファミリーには、「明白な」発音を持つ単語がたくさんあります。いくつかは単に英語の単語です:for、break、case、default、などいくつかの略語、のようなint、あいまいでありません。そしてがありcharます。 私はいつも「炭」の最初の音節のようにそれを言う(そして頭で聞く)傾向があります。「車」のように発音した人と初めてコードについて話していたとき、それは私を不快にさせましたchar。しかし、それを知っていても、炭としての炭は私にとってより適切だと感じています。 そして、次のようなステートメントがありfoo = bar ? *(++baz) : zardozます。 誰もが(彼らの意見では)正しい方法を声に出してコードを読むことを指示する文書を作成しましたか?特定の言語向けか、一般的なコード向けか?

2
C ++のバックトラッキングを理解する
私はC ++の基本について十分に基本的な理解を持っています。また、再帰がどのように機能するかも理解しています。私は、古典的な8つのクイーンの問題やバックトラックで数独を解くなどの特定の問題に遭遇しました。 これに関してはかなり迷っていることに気づきました。再帰スタックに戻って問題を解決するためにやり直すという概念を思い浮かべることができないようです。ペンと紙で簡単に思えますが、このためのコードを書くことになると、これらの問題への攻撃を開始する方法について混乱しています。 バックトラックの初心者向けのチュートリアルがある場合や、これが取り上げられている良い本がある場合に役立ちます。誰かがこのトピックに光を当てるか、まともな参考文献へのリンクを教えてくれれば、本当にありがたいです。 そして、はい、関数型言語の方が簡単であることは知っていますが、命令型言語の実装についても理解したいと思います。
12 c++  recursion 

6
Solo .NETプログラマーがチームに移動[終了]
閉まっている。この質問はトピック外です。現在、回答を受け付けていません。 この質問を改善したいですか? 質問を更新して、 Software Engineering Stack Exchangeのトピックになるようにします。 5年前に閉鎖されました。 私は過去8年間、小規模な新興企業で単独の.NETプログラマーでした。かなりまともなソフトウェアをいくつかまとめましたが、ソース管理(SVN / TFS)などのベストプラクティスに準拠するように常に努力しています。私は他の分野のエンジニアのチームと非常に緊密に連携していましたが、ソフトウェアに至ったとき、私は唯一のプログラミングでした。プログラミングの技術が大好きで、ツールを磨くために新しいことを学ぶのが大好きです。 2週間以内に、20人の.NET開発者のチームで新しい仕事を始めます。私の立場は中級レベルになり、信じられないほど印象的なバックグラウンドを持つプログラマーの下で仕事をします。繰り返しになりますが、開発のチームの側面は私にとって新しいものなので、私はできる限り効果的で簡単に始めることができるいくつかの一般的な「新しい人」のヒントを探しています。 高度なヒントや、コミュニケーションに関する日々の小さなことなど、何でもできます。
12 team  teamwork 

8
プログラマーとしてコンピューターアーキテクチャを学ぶ[非公開]
現在のところ、この質問はQ&A形式には適していません。回答は事実、参考文献、または専門知識によってサポートされると予想されますが、この質問は議論、議論、世論調査、または広範な議論を求める可能性があります。この質問を改善し、場合によっては再開できると思われる場合は、ヘルプセンターをご覧ください。 6年前に閉鎖されました。 私は通常、SOや他の場所(インストラクター、本の著者など)で教導師に出くわし"This will cause alignment issues"ます。 私はこれらすべての情報を知りたい relevantプログラミング。今では通常、低レベルの本(たとえばコンピューターアーキテクチャの本)を見ると、低レベルであり、ソフトウェアデザインではなくコンピューターアーキテクチャが主な関心分野である人々を対象としています。 プログラマーに関連する低レベルのものを扱う本についての推奨事項はありますか?

4
単体テスト中にのみ使用されるメソッドを導入しても大丈夫ですか?
最近、ファクトリーメソッドをTDDしていました。その方法は、単純なオブジェクト、またはデコレータでラップされたオブジェクトを作成することでした。装飾されたオブジェクトは、いずれもStrategyClassを拡張するいくつかのタイプのいずれかです。 私のテストでは、返されたオブジェクトのクラスが期待どおりかどうかを確認したかった。単純なオブジェクトosが返されたときは簡単ですが、デコレータでラップされたらどうしますか? ext/Reflectionラップされたオブジェクトのクラスを見つけるために使用できるようにPHPでコーディングしますが、物事を複雑にしすぎているようで、TDDのルールにやや反対しています。 代わりにgetClassName()、StrategyClassから呼び出されたときにオブジェクトのクラス名を返すように導入することにしました。ただし、デコレータから呼び出された場合は、装飾されたオブジェクトの同じメソッドによって返された値を返します。 より明確にするためのいくつかのコード: interface StrategyInterface { public function getClassName(); } abstract class StrategyClass implements StrategyInterface { public function getClassName() { return \get_class($this); } } abstract class StrategyDecorator implements StrategyInterface { private $decorated; public function __construct(StrategyClass $decorated) { $this->decorated = $decorated; } public function getClassName() { return $this->decorated->getClassName(); } …
12 php  tdd 

5
スイッチに対する複数の方法の利点
本日、上級開発者から「ちなみに、switchステートメントを使用して関数をディスパッチすることに対するあなたの反対は何か」というコードレビューを受け取りました。私は、メソッドを呼び出してスイッチを介して引数をポンピングすることは悪いOOPであり、拡張性などではないことについて多くの場所で読んでいます。これを自分自身で解決したいと思います。 競合するコードの提案を次に示します(phpは例として使用されていますが、より普遍的に適用できます)。 class Switch { public function go($arg) { switch ($arg) { case "one": echo "one\n"; break; case "two": echo "two\n"; break; case "three": echo "three\n"; break; default: throw new Exception("Unknown call: $arg"); break; } } } class Oop { public function go_one() { echo "one\n"; } public function go_two() …

9
オブジェクト指向の落とし穴の回避、Cからの移行、何が効果的でしたか?
私はかなり長い間手続き言語でプログラミングしてきましたが、問題に対する私の最初の反応は、存在するさまざまなエンティティ(オブジェクト)とそれらの関係を考慮するのではなく、実行するタスクに分解することです。 私はOOPで大学のコースを受講し、カプセル化、データ抽象化、多態性、モジュール性、継承の基礎を理解しています。 私が読ん/programming/2688910/learning-to-think-in-the-object-oriented-wayと/programming/1157847/learning-object-oriented-thinking、そして、それらの答えで指摘されている本のいくつかを見ていきます。 中規模から大規模のプロジェクトのいくつかは、OOPの効果的な使用から恩恵を受けると思いますが、初心者として、時間のかかる一般的なエラーを避けたいと思います。 あなたの経験に基づいて、これらの落とし穴は何ですか、そしてそれらの周りの合理的な方法は何ですか?それらが落とし穴である理由、およびあなたの提案が問題に対処するのにどのように効果的であるかを説明できれば、それは高く評価されるでしょう。 「かなりの数のオブザーバーとモディファイヤメソッドを持ち、プライベート変数を使用するのは一般的ですか、それともそれらを統合/削減する技術はありますか?」 メソッドを混在させる正当な理由がある場合、純粋なオブジェクト指向言語としてC ++を使用することは心配していません。(控えめではありますが、GOTOを使用する理由を連想させます。) ありがとうございました!

3
Joshua BlochのBuilderデザインパターンの改善?
2007年に、Joshua Blochsが「ビルダーパターン」を採用し、コンストラクターとセッターの過剰使用を改善するためにどのように変更できるかについての記事を読みました。このデザインパターンの簡単な概要は、こちらで説明されています。 私はこのアイデアが好きで、それ以来ずっと使っています。それに伴う問題は、クライアントの観点からは非常にクリーンで使いやすいものですが、それを実装するのは苦痛になる可能性があります!オブジェクトには単一のプロパティが参照される非常に多くの異なる場所があるため、オブジェクトを作成し、新しいプロパティを追加するには時間がかかります。 だから...私は考えていました。まず、Joshua Blochスタイルのオブジェクトの例: ジョシュブロッホスタイル: public class OptionsJoshBlochStyle { private final String option1; private final int option2; // ...other options here <<<< public String getOption1() { return option1; } public int getOption2() { return option2; } public static class Builder { private String option1; private int option2; // other …

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