ソフトウェア工学

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

5
プロパティの1つが必要ない場合のインターフェイスの実装
とても簡単です。私はインターフェイスを実装していますが、このクラスには不要なプロパティが1つあり、実際には使用しないでください。私の最初のアイデアは、次のようなことをすることでした。 int IFoo.Bar { get { raise new NotImplementedException(); } } これ自体に問題はないと思いますが、「正しい」とは感じません。他の誰かが以前に同様の状況に遭遇したことはありますか?もしそうなら、どのようにアプローチしましたか?

5
同じファイルに複数のクラスが定義されているとPythonicと見なされますか?
初めてPythonを使用して、同じファイルに複数のクラスを記述することになりました。これは、クラスごとに1つのファイルを使用するJavaなどの他の言語とは対照的です。 通常、これらのクラスは1つの抽象基本クラスで構成され、1-2の具体的な実装が使用されますが、使用方法はわずかに異なります。以下にそのようなファイルを1つ投稿しました。 class Logger(object): def __init__(self, path, fileName): self.logFile = open(path + '/' + filename, 'w+') self.logFile.seek(0, 2) def log(self, stringtoLog): self.logFile.write(stringToLog) def __del__(self): self.logFile.close() class TestLogger(Logger): def __init__(self, serialNumber): Logger.__init__('/tests/ModuleName', serialNumber): def readStatusLine(self): self.logFile.seek(0,0) statusLine = self.logFile.readLine() self.logFile.seek(0,2) return StatusLine def modifyStatusLine(self, newStatusLine): self.logFile.seek(0,0) self.logFile.write(newStatusLine) self.logFile.seek(0,2) class GenericLogger(Logger): def …

4
コンポーネントとモジュールに違いはありますか
モジュールとコンポーネントという用語に少し問題があります。私の考えでは、モジュールはバンドルされたクラスであり、明確に定義されたインターフェースを介してのみアクセス可能です。それらはすべての実装の詳細を隠し、再利用可能です。モジュールは、依存するモジュールを定義します。 コンポーネントとの違いは何ですか?いくつかの本で調べましたが、コンポーネントの説明は非常に似ています。


12
職場で作成したコードを個人的なプロジェクトに再利用するのは間違っていますか?
さまざまな職場で、「これは他の状況で本当に役立つだろう」と考えさせるコードを常に書きました。実際、コードを書くのに時間がかかっても、意図的にコードを作成します。これは、将来的に役立つことがわかっています(カスタムSubString()関数など)。これらのスニペットの適切な候補は、さまざまな「ヘルパー」クラスです。 これらのスニペットは、おそらくオンラインの他の場所で見つけることができると確信していますが、ポイントは、私がそれらを書いて、後で他の仕事や個人的なプロジェクトで再び使用することです。現在、私は個人的なコードライブラリを維持しませんが、問題がある、それはあなたがそれを仕事で生産し、再使用しているコード(取ることが間違っている個人的なプロジェクトのために)、および(B他のジョブで)?

4
バックエンドとフロントエンドをWeb開発プロジェクトの2つのポジションに分けることは一般的ですか?
Webのスタートアップで、機能のフロントエンドとバックエンド(基本的に機能全体を担当する)を担当するエンジニアがいる方が一般的ですか?または、エンジニアはバックエンドとフロントエンドを分離しましたか? どちらがより有益で、どのような状況に適していますか? 機能全体を担当するエンジニアが1人いることの欠点は、フロントエンドまたはバックエンドの開発のどちらかではなく、両方ではなく、スピードと品質が低下することがあることです。 1つの機能にフロントエンドとバックエンドの開発者を配置すると、機能の速度と品質が向上し、コラボレーションが促進されます。しかし、1人のエンジニアを別の機能に配置して作業を行うことができるため、2人のエンジニアが1つの機能を使用してリソースの使用率が低い可能性があることを心配しています。 小規模の初期段階のスタートアップでバックエンド/フロントエンドのエンジニアリングリソースを割り当てるための一般的/ベストプラクティスは何ですか?そして、成長するにつれてどのように変化しますか?


5
関数型言語での非同期プログラミング
私はほとんどC / C ++プログラマーです。つまり、私の経験の大部分は手続き型およびオブジェクト指向のパラダイムに関するものです。ただし、多くのC ++プログラマーが認識しているように、C ++は長年にわたって機能的なスタイルに重点を移しており、最終的にC ++ 0xにラムダとクロージャーが追加されました。 とにかく、C ++を使用した関数型スタイルでのコーディングの経験はかなりありますが、LispやHaskellなどの実際の関数型言語の経験はほとんどありません。 私は最近、これらの言語の研究を始めました。なぜなら、特に並行性と分散コンピューティングへの応用に関して、純粋に機能的な言語の「副作用なし」という考えが常に興味をそそっていました。 ただし、C ++のバックグラウンドから来ると、この「副作用なし」の哲学が非同期プログラミングでどのように機能するかについて混乱しています。非同期プログラミングとは、ユーザーが提供するイベントハンドラーをディスパッチして、非同期に発生するイベントを処理するフレームワーク/ API /コーディングスタイルを意味します(プログラムのフロー外)。これには、Boost.ASIOなどの非同期ライブラリ、または単なる古いCさえ含まれます。シグナルハンドラまたはJava GUIイベントハンドラ。 これらすべてに共通することの1つは、非同期イベントハンドラーが呼び出されたことをプログラムのメインフローが認識するために、非同期プログラミングの性質が副作用(状態)の作成を必要とするように見えることです。通常、Boost.ASIOのようなフレームワークでは、イベントハンドラーはオブジェクトの状態を変更するため、イベントの効果はイベントハンドラー関数の有効期間を超えて伝播されます。本当に、イベントハンドラは他に何ができますか?コールポイントがないため、コールポイントに値を「返す」ことはできません。イベントハンドラはプログラムのメインフローの一部ではないため、実際のプログラムに影響を与える唯一の方法は、状態を変更することです(またはlongjmp、別の実行ポイントに変更することです)。 そのため、非同期プログラミングは、副作用を非同期的に生成することがすべてのようです。これは、関数型プログラミングの目標と完全に矛盾しているようです。これら2つのパラダイムは、関数型言語でどのように(実際に)調整されますか?


5
Pythonで辞書とタプルを使用する場合
特定の例は、ファイル名とそのサイズのリストです。リストの各アイテムがフォーム{"filename": "blabla", "size": 123}であるべきか、それともただであるべきであるか決定できません("blabla", 123)。たとえば、サイズにアクセスすることfile["size"]は、file[1]... よりも説明が多いため、辞書は私にとってより論理的なように思えますが、確かにわかりません。考え?

5
具象メソッドのオーバーライドはコードの匂いですか?
具体的なメソッドをオーバーライドするのはコードの匂いだというのは本当ですか?なぜなら、具体的なメソッドをオーバーライドする必要があると思うからです: public class A{ public void a(){ } } public class B extends A{ @Override public void a(){ } } 次のように書き換えることができます public interface A{ public void a(); } public class ConcreteA implements A{ public void a(); } public class B implements A{ public void a(){ } } BがAでa()を再利用したい場合、次のように書き換えることができます。 public class …

4
マジックストリング/数字の使用[終了]
これはやや物議を醸すトピックであり、プログラマーと同じくらい多くの意見があると思います。しかし、そのために、ビジネス(または職場)での一般的な慣行を教えてください。 私の職場では、厳密なコーディングガイドラインがあります。その1つのセクションは、マジックストリング/マジックナンバー専用です。状態(C#の場合): コードでは、記号定数を定義する以外に、数値または文字列のリテラル値を使用しないでください。次のパターンを使用して、定数を定義します。 public class Whatever { public static readonly Color PapayaWhip = new Color(0xFFEFD5); public const int MaxNumberOfWheels = 18; } 例外があります:値0、1、nullはほとんど常に安全に使用できます。多くの場合、値2および-1も問題ありません。ロギングまたはトレースを目的とした文字列は、この規則から除外されます。リテラルは、意味が文脈から明らかであり、将来の変更の影響を受けない場合に許可されます。 mean = (a + b) / 2; // okay WaitMilliseconds(waitTimeInSeconds * 1000); // clear enough 理想的な状況は、次の場合にコードの可読性/保守性への影響を示す公式の研究論文です。 魔法の数字/文字列がいたるところにある 魔法の文字列/数字は、一定の宣言によって合理的に(またはさまざまな範囲で)置き換えられます-「合理的に」使用することについて私に怒鳴らないでください 魔法の文字列/数字は、過剰に置き換えられる必要があります(以下の私の例を参照) 私の同僚の1人と議論するときに科学的根拠に基づいた議論をするためにこれをしたいと思います。彼は次のような定数を宣言するようになります: private const char SemiColon = ';'; private …

9
「for」ループの条件としての「<」と「!=」
次のforループがあるとします*: for (int i = 0; i &lt; 10; ++i) { // ... } 一般に次のように書くこともできます。 for (int i = 0; i != 10; ++i) { // ... } 最終結果は同じですので、一方を他方に対して使用するための実際の議論はありますか?個人的には、i何らかの理由で問題が発生して値10をスキップする場合に前者を使用します。 *マジックナンバーの使用は許されませんが、これは単なる例です。
31 syntax 

4
コミットにバージョンタグを付けないのはいつですか?
コンテキスト:最近、セマンティックバージョニングについて知り、自分のプロジェクトで実際にそれを最適に使用する方法を決定しようとしています。 semverがバージョニングのために大きな変更、小さな変更、およびパッチを考慮に入れていることを考えると、いつコミットに更新されたバージョンのタグを付けるべきではないでしょうか?すべての変更がこれらのカテゴリのいずれかに収まるように思えるので、すべての変更をバージョン管理する必要がありますが、GitHubで人気のあるさまざまなプロジェクトを見ると、これは物事が行われる方法ではないようです(大規模なプロジェクトには数万件のコミットがあり、タグは数百件しかありません)。

5
差別的結合が関数型プログラミングに関連付けられているのはなぜですか?
OOプログラミングの長年にわたって、差別化されたユニオンとは何かを理解していましたが、実際に見逃したことはありませんでした。私は最近、C#で関数型プログラミングをいくつか行ってきましたが、今はそれがあればいいのにと思っています。これは私を困惑させます。なぜなら、一見すると、差別化された結合の概念は、機能的/オブジェクト指向の二分法とはまったく独立しているように見えるからです。 差別化された共用体をオブジェクト指向よりも便利にする関数型プログラミングに固有の何かがありますか、それとも「より良い」方法で問題を分析することを強制することで、単に標準を引き上げて、より良いものを要求していますか?モデル?

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