ソフトウェア工学

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


2
インラインコードコメントの最適なアプローチは何ですか?
20年前のレガシーコードベースにリファクタリングを行っており、同僚とコードのコメント形式(plsql、java)について議論しています。 コメントにはデフォルトの形式はありませんが、ほとんどの場合、人々はコメントで次のようなことをします。 // date (year, year-month, yyyy-mm-dd, dd/mm/yyyy), (author id, author name, author nickname) and comment 私が望む将来および過去のコメントの提案された形式は次のとおりです。 // {yyyy-mm-dd}, unique_author_company_id, comment 私の同僚は、コメントだけが必要であり、過去および将来のすべてのコメントをこの形式に再フォーマットする必要があると言います。 // comment 私の議論: メンテナンス上の理由から、いつ、誰が変更を行ったかを知ることが重要です(この情報はSCMにあります)。 コードは生きており、そのために歴史があります。 変更日付がないと、SCMツールを開いて長いオブジェクト履歴を検索しないと、変更がいつ導入されたかを知ることができないためです。 著者は非常に重要であるため、著者の変更は著者の変更よりも信頼できる 敏ility性の理由、SCMツールを開いてナビゲートする必要はありません 人々は、最近作成または変更されたものよりも、誰かが15年前にしたことを変更することを恐れます。 等 私の同僚の議論: 歴史はSCMにあります 開発者は、コード内のコードの履歴を直接認識してはなりません。 パッケージの長さは15,000行になり、構造化されていないコメントはこれらのパッケージを理解しにくくします 最善のアプローチは何だと思いますか?または、この問題を解決するためのより良いアプローチがありますか?

1
消費者を単体テストするための唯一のソリューションは、サードパーティのコードをラップすることですか?
私は単体テストを行っており、クラスの1つでメソッドの1つからメールを送信する必要があるため、コンストラクター注入を使用Zend_Mailして、Zendフレームワークにあるクラスのインスタンスを注入します。 現在、一部の人々は、ライブラリが十分に安定しており、頻繁に変更されない場合、それをラップする必要はないと主張します。したがって、それZend_Mailが安定しており、変更されず、私のニーズに完全に適合すると仮定すると、そのためのラッパーは必要ありません。 次にLogger依存する私のクラスを見てみましょうZend_Mail: class Logger{ private $mailer; function __construct(Zend_Mail $mail){ $this->mail=$mail; } function toBeTestedFunction(){ //Some code $this->mail->setTo('some value'); $this->mail->setSubject('some value'); $this->mail->setBody('some value'); $this->mail->send(); //Some } } ただし、ユニットテストでは、一度に1つのコンポーネントをテストする必要があるため、Zend_Mailクラスをモックする必要があります。さらに、クラスが抽象ではなく結石に依存するようになったため、依存関係反転の原則に違反してLoggerいます。 Loggerラップせずに単独でテストするにはどうすればよいZend_Mailですか? コードはPHPにありますが、答えはそうである必要はありません。これは、言語固有の機能というよりも設計上の問題です

6
アジャイル手法を使用したソフトウェアの書き換え
アジャイル手法を使用してアプリケーション全体を書き直さなければならないとしたら、どうしますか? 現在のシステムの動作に基づいて、多くのユーザーストーリーを作成できると思います。そして、それらを小さな反復で実装します。しかし、これは私たちが前方に要件を持っているという意味ではないでしょうか? また、いつリリースを開始しますか?アジャイルは、早期かつ頻繁にリリースすべきだと言っていますが、完全な書き換えが完了する前にリリースすることはあまり意味がありません。

5
会社の機密研究コードからのオープンソースコードリリースの作成を最適に管理するにはどうすればよいですか?
私の会社(Acme Technologyと呼びます)には、元々Acme Labsの研究グループから来た数千のソースファイルのライブラリがあり、開発グループで数年間インキュベートされ、最近では少数の顧客に提供されています非開示。Acmeは、おそらくコードの75%をオープンソースコミュニティにリリースする準備をしています。他の25%は後でリリースされますが、現在のところ、顧客が使用する準備ができていないか、競合他社の手に渡らないようにする必要がある将来のイノベーションに関連するコードが含まれています。 現在、コードは#ifdefsでフォーマットされており、同じコードベースを、大学の研究者やはるかに広範な商業顧客がオープンソースに移行する前に利用できるプリプロダクションプラットフォームと連携することができます。実験とプロトタイピング、および将来のプラットフォームとの前方互換性テストに利用できます。単一のコードベースを維持することは、2つのコピーを並行して維持するのが困難な私のグループの経済性(および健全性)にとって不可欠であると考えられています。 現在のベースのファイルは次のようになります。 > // Copyright 2012 (C) Acme Technology, All Rights Reserved. > // Very large, often varied and restrictive copyright license in English and French, > // sometimes also embedded in make files and shell scripts with varied > // comment styles. > > > ... …

1
高次リスト関数のC ++ 11サポート
などなど、ほとんどの関数型プログラミング言語(例えばCommon Lispの、スキーム/ラケット、Clojureの、ハスケル、スカラ座、OCamlで、SML)リスト上のいくつかの一般的な高階関数をサポートするには、map、filter、takeWhile、dropWhile、foldl、foldr(例えば参照、Common Lispの、スキーム/ラケットをClojureの並列リファレンスシート、Haskell、Scala、OCaml、およびSMLドキュメント。 C ++ 11には、リストに同等の標準メソッドまたは関数がありますか?たとえば、次のHaskellスニペットを考えます。 let xs = [1, 2, 3, 4, 5] let ys = map (\x -> x * x) xs 最新の標準C ++で2番目の式をどのように表現できますか? std::list<int> xs = ... // Initialize the list in some way. std::list<int> ys = ??? // How to translate the Haskell expression? 上記の他の高階関数はどうですか? C …

4
Springを使用してBeanをインスタンス化しない場合
私はSpringの正しい使い方を理解しようとしています。構文的にではなく、その目的の観点から。Springを使用している場合、SpringコードはすべてのBeanインスタンス化コードを置き換える必要がありますか?Beanをインスタンス化するために、Springを使用する場合と使用しない場合 次のコードサンプルが私のジレンマを理解するのに役立つかもしれません: List<ClassA> caList = new ArrayList<ClassA>(); for (String name : nameList) { ClassA ca = new ClassA(); ca.setName(name); caList.add(ca); } Springを構成すると、次のようになります。 List<ClassA> caList = new ArrayList<ClassA>(); for (String name : nameList) { ClassA ca = (ClassA)SomeContext.getBean(BeanLookupConstants.CLASS_A); ca.setName(name); caList.add(ca); } 私は個人的にここでSpringを使用することは不必要なオーバーヘッドだと思います、なぜなら コードは読みやすく、理解しやすいです。 の複数の実装やさまざまな実装があることを期待していないため、Dependency Injectionにはあまり適していません。SpringのClassA設定を後から自由に置き換えたいと思います。 私は正しいと思っていますか?そうでない場合、どこで間違っていますか?
13 java  spring 

5
コンストラクタの逆の関数の適切な用語は何ですか?データ型から値をラップ解除するには?
編集:私は質問を少し言い換えています。デストラクタという用語がOOPでまったく異なる何かに使用されていることに気づかなかったため、どうやら混乱が生じたようです。これは、オブジェクトが破棄されるときに呼び出される関数です。関数型プログラミングでは、可変状態を回避しようとするため、それに相当するものはありません。(質問に適切なタグを追加しました。) 代わりに、値をアンラップするためのレコードフィールド(特にnewtypes などの単一値のデータ型の場合)がdestructorまたはdeconstructorと呼ばれることもあります。たとえば、(Haskellで)次のようにします: newtype Wrap = Wrap { unwrap :: Int } ここWrapにコンストラクタがあり、それunwrapは何ですか? 質問は次のとおりです。 unwrap関数型プログラミングをどのように呼び出すのですか?解体者?デストラクタ?それとも他の言葉で? そして、明確にするために、この/他の用語は他の関数型言語に適用できますか、それともHaskellだけで使用されますか? おそらく、これには一般的に、非機能的な言語での用語はありますか? 私は両方の用語を見ました、例えば: ...ほとんどの場合、スマートコンストラクターとデストラクタを提供して、これらを簡単に操作できるようにします。... で、Haskellのウィキ、または ...ここでの一般的なテーマは、コンストラクターとデコンストラクターのペアを融合することです... で、Haskellのwikibook(ここではそれはおそらく、もう少し一般的な意味でのものです)、または newtype DList a = DL { unDL :: [a] -> [a] } unDL関数はdeconstructorで、DLコンストラクターを削除します。... 中実世界ハスケル。

3
Javaのループの内側または外側で変数を宣言すると、違いが生じますか?[閉まっている]
閉まっている。この質問はトピック外です。現在、回答を受け付けていません。 この質問を改善したいですか? 質問を更新して、 Software Engineering Stack Exchangeのトピックになるようにします。 2年前に閉店。 可能な重複: どこで変数を宣言しますか?メソッドのトップまたはそれが必要なとき? Javaのループの内側または外側で変数を宣言すると、違いが生じますか? これは for(int i = 0; i < 1000; i++) { int temp = doSomething(); someMethod(temp); } これに等しい(メモリ使用量に関して)? int temp = 0; for(int i = 0; i < 1000; i++) { temp = doSomething(); someMethod(temp); } また、一時変数がArrayListなどの場合はどうなりますか? for(int i = …
13 java  variables  loops 

8
実装可能かどうかわからない機能を提供することを約束する必要がありますか?
HNの記事で、次のアドバイスに出会いました。 不明な場合でも、常に顧客/ユーザーに「はい」と伝えます。90%の時間、あなたはそれを行う方法を見つけるでしょう。10%の時間、戻って謝罪します。大幅な個人的成長のための低価格 しかし、顧客/ユーザーに何らかの約束をする前に、実行可能性分析を行うべきだと常に考えていました。それでは、どのような状況で上記のアドバイスを適用すべきでしょうか?

4
署名が同一の2つのインターフェース
カードに2つの重要な機能セットがあるカードゲームをモデル化しようとしています。 最初は効果です。これらは、カードをプレイしたときに起こるゲームの状態の変化です。有効なインターフェイスは次のとおりです。 boolean isPlayable(Player p, GameState gs); void play(Player p, GameState gs); そして、あなたはそのコストをまかなうことができ、そのすべての効果がプレイ可能である場合にのみ、カードをプレイ可能と考えることができます。そのようです: // in Card class boolean isPlayable(Player p, GameState gs) { if(p.resource < this.cost) return false; for(Effect e : this.effects) { if(!e.isPlayable(p,gs)) return false; } return true; } さて、これまでのところ、非常に簡単です。 カードの他の機能セットは能力です。これらの能力は、ゲームの状態の変化であり、自由にアクティブ化できます。これらのインターフェイスを思いついたとき、それらをアクティブ化できるかどうかを判断する方法と、アクティブ化を実装する方法が必要であることに気付きました。最終的には boolean isActivatable(Player p, GameState gs); void activate(Player p, …
13 interfaces 

2
大規模な機能プログラミングアプリケーションの作成に一般的に使用される特定のワークフローまたは設計パターンはありますか?[閉まっている]
閉じた。この質問はより集中する必要があります。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集するだけで1つの問題に焦点を当てるように質問を更新します。 4年前に閉鎖されました。 Clojureをしばらく使ってきましたが、重要なプロジェクトでは使用していません。基本的に、構文といくつかのイディオムに慣れてきました。OOPのバックグラウンドから来て、Clojureが私が非常によく見た最初の関数型言語であるため、私は当然、物事の関数型の方法にそれほど満足していません。 とはいえ、大規模な機能アプリケーションの作成に共通する特定のワークフローやデザインパターンはありますか 「実際に」関数型プログラミングの使用を開始したいのですが、現在の専門知識の不足により、大失敗に終わるのではないかと心配しています。 「4つのギャング」はOOプログラマーにとって非常に標準ですが、機能的なパラダイムにより向けられた類似のものはありますか?私が見つけたほとんどのリソースには、優れたプログラミングナゲットがありますが、一歩踏み込んで、より広範な、よりアーキテクチャ的な外観を与えることはできません。

4
ペアプログラミングの理由
私は、管理者がペアプログラミングのアイデアを私または別のマネージャー/開発者に引き継いだいくつかのショップで働いてきましたが、まったく後れを取ることができません。開発者の観点からは、このコーディングスタイルへの移行が有益である理由を見つけることができません。また、小さなチームのマネージャーとして利益を見ることもありません。 私はそれが基本的な構文エラーに役立ち、何かをハッシュする必要がある場合に役立つことができることを理解していますが、プログラミングループの外にいるマネージャーは、デザイナーよりもFacebookやRedditに行くのを防ぐ方法としてそれを見続けているようです設計ツール。 開発フロアの近くにいる人で、明らかに私のやり方や主題に関するwikiページからはまったく理解できない...高レベルの管理職から、スクラムやアジャイルを扱う際のペアプログラミングの利点は何ですか環境?

6
未完成プロジェクトのコードをgithubに配置することの利点と欠点は何ですか
私は、githubsを介してオープンソースとしてリリースする予定のプロジェクトに取り組む予定です。公開前にプロジェクトが動作状態になるまで待つのではなく、最初からgithubにコードを配置することの利点は何ですか。 問題があれば、この特定のプロジェクトはC#アプリ/サービスであり、無料のgithubアカウントしか持っていません(そのため、非公開にして後でカバーを取り戻すことはできません)

8
コーディング標準はもう必要ですか?
コーディング標準が非常に役立つことが証明されていることは知っています。ただし、プログラマが好む標準にフォーマットする多くの異なるツールとIDEがあります。コードがきちんと/コメントされている限り(スパゲッティの混乱ではない)、コーディング標準の必要性は見当たりません。 コーディング標準の開発に関する議論はありますか(まだありませんが、作成を検討していました)。

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