ソフトウェア工学

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

2
オブジェクト指向とベクトルベースのプログラミング
私はオブジェクト指向とベクターベースのデザインの間で引き裂かれています。オブジェクトがアーキテクチャ全体に与える能力、構造、安全性が大好きです。しかし同時に、速度は私にとって非常に重要であり、配列に単純なフロート変数があると、MatlabやPythonのnumpyなどのベクトルベースの言語/ライブラリで非常に役立ちます。 これが私のポイントを説明するために書いたコードです 問題:トウのボラティリティ値を追加します。xとyが2つのボラティリティ数である場合、ボラティリティの合計は(x ^ 2 + y ^ 2)^ 0.5です(特定の数学的条件を仮定しますが、ここでは重要ではありません)。 この操作を非常に高速に実行すると同時に、人々がボラティリティを間違った方法(x + y)で追加しないようにする必要があります。これらは両方とも重要です。 オブジェクト指向ベースのデザインは次のようになります。 from datetime import datetime from pandas import * class Volatility: def __init__(self,value): self.value = value def __str__(self): return "Volatility: "+ str(self.value) def __add__(self,other): return Volatility(pow(self.value*self.value + other.value*other.value, 0.5)) (余談:Pythonを初めて使用する場合__add__は、単なる+演算子をオーバーライドする関数です) ボラティリティ値のトウリストを追加するとしましょう n = 1000000 vs1 = Series(map(lambda …

5
コーディング標準文書の作成
私は、主な仕事がSCADAとPLCであり、他の制御システムのスタッフと一緒に、制御システムの会社で働いています。 ソフトウェア開発は、社内のプロジェクト管理および評価システムを作成する決定が下されるまで、あちこちで少しだけ離れて、会社が実際に行うものではありません。 このプロジェクトは、もともとソフトウェアの人としてここに来た人々によって引き継がれ、私たちはほとんどジュニアです。 プロジェクトは小さなものから始まったので、デザイン、データベースなどのようなものだけをドキュメント化しましたが、コーディング形式/規約については実際には合意しませんでした。 StyleCopを使用してコードを適切に文書化したことを確認しましたが、適切な標準を継続し、今後大きな開発作業が行われる場合は誰でも作業できるように、コーディング規約/プラクティスの公式文書が必要だと感じています良いベースプレートがあります。 そこに問題があります、コーディング規約と標準のための文書をどのように作成するのか分かりません、私が考えることができるのは良いプラクティスと悪いプラクティスの例です(たとえば、変数に名前を付けるときのキャメルケース、ハンガリー語の表記を避けるなど)有能なプログラマー(明らかに)ですが、この種のチャーターはありません。 それにポイントを置くために、私の質問は次のとおりです。良いコーディング標準文書の重要な側面と内容は何ですか?

2
共有キャッシュ-無効化のベストプラクティス
キャッシュオブジェクトを無効化/更新するためのより良いアプローチは何か知りたいです。 前提条件 リモートmemcachedサーバーを持つ(複数のアプリケーションのキャッシュとして機能する) すべてのサーバーはAzure(アフィニティリージョン、同じデータセンター)によってホストされます キャッシュオブジェクトのサイズは200バイトから50キロバイトまでの範囲です アプローチ1(できるだけ早くキャッ​​シュに保存) オブジェクトAが作成されます->データベースに保存し、キャッシュに保存します クライアントによって要求されたオブジェクトA->キャッシュの存在をチェック、そうでなければデータベースからフェッチしてキャッシュに保存 オブジェクトAが更新されます->データベースに保存、キャッシュに保存 アプローチ1はより簡単なようです。何かが作成されたら、できるだけ早くキャッ​​シュに入れてください。誰かに関係なくそれが必要になります。 アプローチ2(遅延キャッシュストア) オブジェクトAが作成されます->データベースに保存 クライアントによって要求されたオブジェクトA->キャッシュの存在をチェック、そうでなければデータベースからフェッチしてキャッシュに保存 オブジェクトAが更新されます->データベースに保存、キャッシュのキーを削除 アプローチ2は、より多くのメモリを認識しているようです。このアプローチでは、リクエストされたアイテムのみがキャッシュに保存されます。 質問1:パフォーマンスを考慮して、より良いアプローチは何でしょうか?メモリもCPUもまだカウントされません。 質問2:私の考えは一種の時期尚早な最適化ですか? 質問3:他に考えはありますか?他のアプローチ?

3
MVCでは、DAOはコントローラーまたはモデルから呼び出す必要があります
Controllerクラスから直接呼び出されるDAOに対するさまざまな引数と、ModelクラスからのDAOに対するさまざまな引数を見てきました。実際、MVCパターンに従っている場合、コントローラーはDAOと結合するべきではなく、Modelクラス内部からDAOを呼び出し、コントローラーがモデルクラスを呼び出す必要があるのは、なぜWebアプリケーションからモデルクラスを切り離し、RESTサービスがモデルクラスを使用するなどのさまざまな方法で機能を公開できるからです。 コントローラでDAO呼び出しを記述する場合、RESTサービスが機能を再利用することはできません。両方のアプローチを以下にまとめました。 アプローチ#1 public class CustomerController extends HttpServlet { proctected void doPost(....) { Customer customer = new Customer("xxxxx","23",1); new CustomerDAO().save(customer); } } アプローチ#2 public class CustomerController extends HttpServlet { proctected void doPost(....) { Customer customer = new Customer("xxxxx","23",1); customer.save(customer); } } public class Customer { ........... private void save(Customer customer){ …

6
コメントとして図を使用してソースコードに注釈を付ける
私は、計算幾何学やグラフィックス、およびこれらの種類のトピックに触れる多くの(主にc ++およびjavascript)コードを書くので、視覚図は問題を解決するプロセスの不可欠な部分であることがわかりました。 「ああ、手書きの図をなんらかの方法でコメントとしてコードの一部に添付できたら素晴らしいのではないか」と判断しました。これにより、私が取り組んだものに戻ることができます。数日、数週間、数か月前、そしてはるかに迅速にアルゴリズムを再作成します。 視覚的な学習者として、単純な図はあらゆるタイプの非自明なデータ構造に関する理解と推論に役立つため、これはほとんどすべてのタイプのプログラミングで生産性を向上させる可能性があると感じています。たとえばグラフ。大学でのグラフ理論の授業中、私は実際に図式表現を描くことができるグラフ関係を本当に理解することができただけでした。 そう... 私の知る限り、IDEを使用して写真をコードへのコメントとして保存することはできません。 私や他の誰かが、イメージをbase64バイナリ文字列に変換してコードに挿入できる、かなり使いやすいツールを考え出すことができると考えました。 変換/挿入プロセスを十分に合理化できれば、ダイアグラムと実際のコードの接続がはるかに良くなるため、ノートブックを時系列に検索する必要がなくなります。さらに素晴らしい:IDEのプラグインが自動的に画像を解析して表示します。理論的な観点から、これについて絶対に難しいことはありません。 私の推測では、お気に入りのIDEを拡張し、これらのプラグインを維持する方法を実際に把握するには、余分な時間がかかるので、同じ解析を行う一種のコードポストプロセッサに完全に満足し、画像をレンダリングして、コードをブラウザや何かの中に並べて表示します。私は貿易でjavascriptプログラマーだからです。 人々はどう思いますか?誰もこれにお金を払うでしょうか?私は...するだろう。しかし、私は、私またはかなりの数の同僚がそのようなものにお金を払うかどうかに関係なく、そのようなものが成功する可能性が高い唯一の方法は、オープンソースのリリースを通じてであることを指摘するでしょう。

11
KISSの原則はプログラミング言語の設計に適用されますか?
KISS(「シンプルに保つ、バカにする」または「シンプルにバカにする」、例えばこちらを参照)は、明らかに工学に由来するものですが、ソフトウェア開発の重要な原則です。ウィキペディアの記事から引用: 原則は、ジョンソンが設計エンジニアのチームにいくつかのツールを渡したという物語によって最もよく例証されています。したがって、「愚かな」とは、物事が壊れる方法と、それらを修正するために利用できる洗練度との関係を指します。 これをソフトウェア開発の分野に適用したい場合、「ジェット機」を「ソフトウェアの一部」に、「平均メカニック」を「平均開発者」に、「戦闘条件下」を「予想されるソフトウェア開発/保守中」に置き換えます条件」(期限、時間の制約、会議/中断、利用可能なツールなど)。 したがって、後で作業しやすくするために、ソフトウェアの一部をシンプルに(またはコンマを省略した場合は単純な愚かさ)維持することを試みることが一般に受け入れられている考えです。 しかし、KISSの原則はプログラミング言語の設計にも適用できますか?この原則を念頭に置いて特別に設計されたプログラミング言語、つまり「平均的な労働条件の下で平均的なプログラマーができるだけ少ない労力でできるだけ多くのコードを記述および維持できるようにする」ことを知っていますか? 特定の言語を引用する場合、この意図が言語設計者によって明確に表現されているドキュメントへのリンクを追加できると便利です。いずれにせよ、特定のプログラミング言語に関する個人的な意見ではなく、デザイナーの(文書化された)意図について学ぶことに興味があります。

8
関数型言語の構文が人間の言語により近いのはなぜですか?
私は関数型プログラミングに興味があり、Haskellと直接対決することにしました。私の頭が痛い...しかし、私は最終的にそれを取得します...しかし、私は1つの好奇心を持っていますが、なぜ構文はとても謎めいています(別の言葉がないのですか)? それがより表現力がなく、人間の言語により近い理由はありますか? FPは数学の概念のモデリングが得意であり、簡潔な表現手段の一部を借用していることを理解していますが、それでも数学ではありません...それは言語です。

5
コーディング統合は継続的インテグレーションサーバーによって実施されるべきですか?
コーディング標準/スタイルは、静的分析ツール(例:PMD、StyleCop / FxCop)を実行し、標準に従っていない場合はビルドに失敗する継続的統合サーバーによって実施されるべきですか?ビルドを失敗させるためにどの種類のルールを使用すべきではありませんか?

4
ドメインからリポジトリにアクセスする
タスクログシステムがあるとします。タスクがログに記録されると、ユーザーはカテゴリを指定し、タスクはデフォルトで「未処理」のステータスになります。このインスタンスでは、CategoryとStatusをエンティティとして実装する必要があると想定しています。通常、私はこれをします: アプリケーション層: public class TaskService { //... public void Add(Guid categoryId, string description) { var category = _categoryRepository.GetById(categoryId); var status = _statusRepository.GetById(Constants.Status.OutstandingId); var task = Task.Create(category, status, description); _taskRepository.Save(task); } } エンティティ: public class Task { //... public static void Create(Category category, Status status, string description) { return new Task …

5
リリースされたバイナリをバージョン管理下に保つにはどうすればよいですか?
リリースされたバイナリをバージョン管理下に保つにはどうすればよいですか?これにより、各リリース間で変更された内容を追跡できます。ソースリポジトリからリリースされたバイナリを分離するつもりです。リリースされたバイナリは、継続的インテグレーションソフトウェアから構築されるか、手動でコンパイルされます。

4
スプリント中のスプリントバックログの変更について混乱している
私は最近スクラムについて多くのことを読んでおり、スプリント中にスプリントのバックログを変更しても大丈夫かどうかについて、私にとって矛盾する情報を見つけました。スクラムのWikipediaの記事は、それがOKではない、と様々言う他の記事は、同様にこれを言います。また、私のソフトウェア開発教授は、スクラムの概要の中で同じことを教えました。 ただし、私はトレンチからスクラムとXPを読み、タスクボード上の計画外の項目のセクションについて説明します。そこで、スクラムガイドを調べて、スプリント中に「スプリント目標に影響する変更は行われていない」とスプリント目標の議論で「作業が開発チームの予想と異なることが判明した場合、その後、プロダクトオーナーと協力して、スプリント内のスプリントバックログの範囲を交渉します。」さらに、スプリントバックログの議論でも述べています。 スプリントバックログは、進行中の変更をデイリースクラムで理解できるほど十分に詳細な計画です。開発チームはスプリント全体でスプリントバックログを変更し、スプリント中にスプリントバックログが発生します。この出現は、開発チームが計画を進め、スプリント目標を達成するために必要な作業についてさらに学習するときに発生します。 新しい作業が必要になると、開発チームはそれをスプリントバックログに追加します。作業が実行または完了すると、推定残り作業が更新されます。計画の要素が不要と判断された場合、それらは削除されます。開発チームのみが、スプリント中にスプリントバックログを変更できます。スプリントバックログは、開発チームがスプリント中に達成する予定の作業の非常に目に見える、リアルタイムの画像であり、開発チームのみに属します。 したがって、この時点で私は完全に混乱しています。それについて考えると、2番目のアプローチを取る方が理にかなっています。バックログの個々の特定の項目は、私にとって最も重要なものではなく、むしろスプリントの目標であるように思われるため、スプリントの目標を変更するのではなく、バックログを変更できるのは理にかなっています。たとえば、製品の所有者とチームの両方がストーリーについて同じページにいると思っていたが、スプリントが進むにつれて誤解があることがわかった場合、そのストーリーを構成するタスクをそれに応じて変更することは理にかなっているようです。または、忘れられたストーリーまたはタスクがあり、スプリントの目標を達成するために必要な場合、スプリント中にストーリーまたはタスクをバックログに追加するのが最善だと思います。 しかし、スプリントのバックログへの変更は大丈夫ではないと断固として思われる人がたくさんいます。どういうわけかその位置を誤解していますか?それらの人々はどうにかしてスプリントのバックログを異なって定義していますか?スプリントのバックログについての私の理解は、スプリントのバックログは、ストーリーとそれらが分解されるタスクの両方で構成されるということです。 とにかく、私はこの問題に関する意見を本当に感謝します。私は、理想的なスクラムアプローチがスプリント中にスプリントバックログを変更することと、スクラムを開発にうまく使用する人々がスプリント中にスプリントバックログを変更できるかどうかの両方を把握しようとしています。

5
switchステートメント-到達できない場合のデフォルトのケースの処理
私のクラスが所有する列挙型の値を処理するためにswitchステートメントを使用していて、可能な値ごとにケースがある場合-「デフォルト」のケースを処理するコードを追加する価値はありますか? enum MyEnum { MyFoo, MyBar, MyBat } MyEnum myEnum = GetMyEnum(); switch (myEnum) { case MyFoo: DoFoo(); break; case MyBar: DoBar(); break; case MyBat: DoBat(); break; default: Log("Unexpected value"); throw new ArgumentException() } これは、このコードに到達できない(ユニットテストでも)ことが原因だとは思いません。私の同僚はこれに同意せず、これがMyEnumに追加される新しい値によって引き起こされる予期しない動作から私たちを保護すると考えています。 コミュニティとは何ですか?

5
トランクにコミットされる前にコードをレビューする最良の方法は何ですか?(SVN)
SVNトランクにコミットされる前にコードをレビューする最良の方法は何ですか?私が考えているアイデアの1つは、開発者にコードをブランチにコミットさせ、ブランチのリビジョンをトランクにマージしながらコードを確認することです。これは良い習慣ですか?そうでない場合、トランクにコミットされる前にコードをレビューするために他に何ができますか?

1
プッシュおよびプル開発モデルとの違いは何ですか?
私はExtreme Programming Explained、Second Editionを読み、第11章「制約の理論」で著者は古くて時代遅れの「プッシュ」開発モデルとXPの方法、「プル」開発モデルについて話しています。それは非常に重要な概念のように見えますが、非常に小さなパラグラフと、「滝」と反復プロセスの単なるイラストである2つの画像のみを必要とします。私は検索しましたが、本の残りの部分ではそれについてこれ以上説明しません。それについてのさらなる説明や議論もインターネットで見つけることができませんでした。 それらについての唯一の違いが、一方が「ウォーターフォール」であり、もう一方が反復的である場合、それらはなぜプッシュし、なぜプルするのでしょうか? 誰が本当にこれら2つの違いが何であるかを理解し、いくつかの良い例を挙げていますか?

5
ツールをサポートして.NETで単一のコーディング標準を確保する方法
おそらく、基本的な状況は誰もが知っています。チーム内の特定のコーディング標準について合意したので、今度はすべてのコーディング標準に従うようにします。 重いペアプログラミングを介してそれを行うものもあれば、コーディング標準のリストを維持し、手動でレビューするものもあります。また、Visual Studioの静的コード分析ツールを使用して、コーディング標準が適用されていることを確認するものもあります。 コーディング標準を確保するためのベストプラクティスは何ですか?どのツールを使用しますか?すべての開発者が知っておくべき重要なツールはありますか?開発ツールにコードの標準化をどのように統合しますか?
14 c#  .net  coding-style 

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