ソフトウェア工学

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

13
OOPのオブジェクトはエンティティを表す必要がありますか?
オブジェクトはエンティティを表す必要がありますか? エンティティ私のような何かを意味Product、Motor、ParkingLotなど、物理的、あるいは明確な非物理的な概念オブジェクト-だけでなく、いくつかのコアデータは明らかにオブジェクトに属していると、定義されているもの、およびいくつかの関数/メソッドコアデータを明確に操作します。 たとえば、aのオブジェクトDemon、それ自体のエンティティ、想像上のオブジェクト、おそらく物理的ではなくエンティティを持つことができます オブジェクトは、メソッドのコレクション、共通の目標に結び付く共通のプロシージャセットになりますか? 例:クラスを呼び出すことができるMotorOperationsか、MotorActionsそこには実体ではありませんが、クラス内のメソッドは次のようなことを行う場合には、 getMotorDataFromHTMLForm() getMotorManufacturers() selectMotorFromUserRequirements($ requirements) canMotorCanHandleOperatingConditions($ conditions) computePowerConsumptionForMotor($ id) クラスは通常、オブジェクトの中心となるデータ+データの操作として定義されます。そのため、Motorモーターの仕様に関連するいくつかのモーター変数があり、それらのデータを組み合わせて何かを生成する操作があります。 私の場合、データを操作するクラスとクラスを通過するデータを持っているようなもので、一時的なクラススルーデータ以外に「モーター操作」を中心としたデータはありません。 質問 クラスはエンティティのないオブジェクトを表すことができますか?そうでない場合、なぜそれらは悪い/不完全/非OOP中心ですか?OOPに合わせて概念的に変更/改善する必要がある方法はありますか?

23
すべてのプログラマーが正規表現を学ぶ必要がありますか?[閉まっている]
私はプログラミングが初めてで、インタビューで正規表現に関する質問がありました。言うまでもなく答えられませんでした。だから私は正規表現を学ぶべきかどうか疑問に思っていましたか?すべての分野のすべてのプログラマーにとって必須ですか?または、特定のフィールドのプログラミングには必須ですか? 関連する質問: 正規表現が病的なほど魅力的なのはなぜですか? 正規表現を使用すべきでない場合

19
2人のプログラマーの選択:経験と情熱[非公開]
私はプログラマーを雇わなければならない立場にあり、2人の候補者の選択肢があります。最初の候補者は経験がありますが、コーディングには情熱がなく、彼はそう言いますが、2番目の候補者は経験がありますが情熱、彼はインタビューでよくやったと認定されています。 私たちには誰かを訓練するためのリソースがありますが、私は本当にこのプロセスを吹き飛ばして失望する人を雇いたくありません。誰もこの状況にアプローチする方法について私を助けることができますか?

15
演算子のオーバーロードに対する引数を理解していません[非公開]
私は彼が言うジョエルの記事の一つを読んだ: 一般的に、私は物事を隠す言語機能が少し怖いことを認めなければなりません。コードが表示されたら i = j * 5; …Cでは、少なくとも、jに5が乗算され、結果がiに格納されていることがわかります。 しかし、C ++で同じコードスニペットを見ると、何もわかりません。なし。C ++で実際に何が起こっているのかを知る唯一の方法は、iとjの型を調べることです。これは、jがoperator*オーバーロードされた型であり、乗算しようとするとひどく機知に富んだ動作をするためです。 (エンファシス鉱山。)物事を隠す言語機能が怖い?どうしてそれが怖いの?物事を隠すこと(抽象化とも呼ばれます)は、オブジェクト指向プログラミングの重要なアイデアの1つではありませんか?methodを呼び出すたびにa.foo(b)、それが何をするのかまったくわかりません。あなたは他のどこかで宣言されるかもしれないタイプaとbは何かを見つけなければなりません。それでは、オブジェクト指向プログラミングはプログラマからあまりにも多くのことを隠してしまうので、オブジェクト指向プログラミングを廃止すべきでしょうか? そして、演算子のオーバーロードをサポートしていない言語で記述する必要があるかもしれないとはどうj * 5違いj.multiply(5)ますか?繰り返しになりますが、loとbeholdは、非常に機知に富んだ何かを行うメソッドを持つ型である可能性があるためj、multiplyメソッドの型とピークをメソッド内で調べる必要があります。jmultiply 「ムアハハ、私はメソッドmultiplyに名前を付ける邪悪なプログラマーですが、実際にそれが行うことは完全に曖昧で直感的ではなく、物事を増やすこととはまったく関係ありません。」それはプログラミング言語を設計するときに考慮しなければならないシナリオですか?次に、誤解を招く可能性があるという理由で、プログラミング言語の識別子を放棄する必要があります! メソッドが何をするのか知りたい場合は、ドキュメントを見るか、実装の内部を覗いてください。演算子のオーバーロードは単なる構文上のシュガーであり、それがゲームをどのように変えるかはわかりません。 教えてください

15
変数名にUnicode文字を使用するのは悪いですか?[閉まっている]
私は最近、ランキングアルゴリズムであるAllegSkillをPython 3に実装しようとしました。 数学は次のようになります。 いいえ、本当に。 これは私が書いたものです: t = (µw-µl)/c # those are used in e = ε/c # multiple places. σw_new = (σw**2 * (1 - (σw**2)/(c**2)*Wwin(t, e)) + γ**2)**.5 実際、Python 3が変数名を受け入れない、√または²変数名として受け入れないのは残念だと思いました。 >>> √ = lambda x: x**.5 File "<stdin>", line 1 √ = lambda x: x**.5 ^ SyntaxError: invalid character …
82 naming  unicode 

11
Javaの開発者は意識的にRAIIを放棄しましたか?
長年のC#プログラマーとして、最近、Resource Acquisition Is Initialization(RAII)の利点について詳しく知るようになりました。特に、C#のイディオムは次のとおりです。 using (var dbConn = new DbConnection(connStr)) { // do stuff with dbConn } C ++に相当するものがあります。 { DbConnection dbConn(connStr); // do stuff with dbConn } つまりDbConnection、usingブロックのようにリソースの使用を囲むことを覚えておくことは、C ++では不要です。これは、C ++の大きな利点のようです。あなたはタイプのインスタンスメンバを持つクラスを考えるとき、これは、より説得力があるDbConnectionたとえば、 class Foo { DbConnection dbConn; // ... } C#では、Foo IDisposableを次のように実装する必要があります。 class Foo : IDisposable { DbConnection dbConn; public void …
82 java  c#  c++  language-design 

18
就職の面接で優秀なプログラマーを見分ける最善の方法は何ですか?
インタビューの設定では:誰かがあるときに確実に識別するための最良の方法は何である優秀なプログラマは。これにより、彼はスペクトルの低域に向かって彼の仲間よりも10-15倍効率的/迅速/優れている人の一人であることを意味します。 私たちの多くは、FizzBu​​zz問題を弱いものを取り除く方法として聞いています。確かに、その問題を解決するのに5〜10分かかることは、申請者が弱い候補者であるという重大な指標です。私は、良い指標があなたが書くことができる限り早くそれを解決することができると仮定します。ただし、これでは十分ではないようです。 それは、彼に適度に複雑なバグのあるプログラムを与え、彼がそれをどれくらい速く調べて、それに関するすべての問題を特定できるのか、というようなことでしょうか?

10
nullが悪い場合、なぜ現代の言語はそれを実装するのですか?[閉まっている]
JavaやC#のような言語のデザイナーは、null参照の存在に関連する問題を知っていたはずです(null参照は本当に悪いことですか?を参照)。また、オプションタイプの実装は、null参照ほど複雑ではありません。 とにかくそれを含めることにしたのはなぜですか?null参照の欠如は、言語の作成者とユーザーの両方から、より良い品質のコード(特により優れたライブラリ設計)を奨励(または強制)するだろうと確信しています。 それは単に保守主義のせいなのでしょうか-「他の言語にもあります、我々もそれを持たなければなりません...」?

6
TRACEレベルが存在する理由と、DEBUGではなくいつ使用する必要があるのですか?
Log4J、Slf4J、およびその他のJavaのロギングフレームワークには、ロギング用に2つの「開発者」レベルがあります。 デバッグ トレース 説明が明確であるため、DEBUGの機能を理解しています。 DEBUGレベルは、アプリケーションのデバッグに最も役立つ詳細な情報イベントを指定します。 しかし、TRACEレベルは、そのユースケースについてあまり明確ではありません。 TRACEレベルは、DEBUGよりもきめ細かい情報イベントを指定します (ソース:log4J JavaDoc) これは、TRACEの使用方法や使用時期を教えてくれません。興味深いことに、これはsyslog標準で定義されている重大度レベルではありません。TRACEとDEBUGの違いをグーグルで検索すると、「DEBUGを使用してください。TRACEもあります」と返されるようです。TRACEレベルの特定のユースケースが見つかりませんでした。私が見つけた最高のものは、レベルの存在のメリットについて議論しているこの古いwikiページでした。 これは、建築家として、私の頭の中にたくさんの旗や質問を投げかけます。若い開発者が私のアーキテクチャにTRACEを追加するように頼んだら、私は彼に質問を投げかけました: DEBUGではなくTRACEで記録する必要がある情報の例は何ですか? その情報を記録することで、どのような特定の問題を解決できますか? これらの例では、DEBUGレベルではなくTRACEレベルでログを明確に区別するログ情報のプロパティは何ですか? その情報がログインフラストラクチャを通過する必要があるのはなぜですか? 単に使用するのではなく、ログジャーナルにその情報を保持することの利点は何System.out.printlnですか? デバッガーよりもログを使用する方が良いのはなぜですか? TRACEレベルでのロギングの標準的な例は何でしょうか? 例のDEBUGではなく、TRACEレベルでログを記録することで得られた具体的な利点は何ですか? なぜこれらのゲインが重要なのですか? 逆に:DEBUGではなくTRACEでログを記録することで回避した問題は何ですか? これらの問題を他にどのように解決できますか?TRACEレベルでのロギングが他のソリューションよりも優れているのはなぜですか? TRACEレベルのログステートメントを製品コードに残すべきですか?どうして? しかし、ほとんどの主要なフレームワークに存在することを考えると、何かに役立つと思いますか?それで... TRACEは何のためにあり、DEBUGと何が違うのですか?
82 java  logging 

9
動的型付けの生産性向上とは何ですか?[閉まっている]
動的に型付けされた言語は、静的に型付けされた言語よりも生産性が高いという主張をよく耳にしました。この主張の理由は何ですか?構成よりも規約、関数型プログラミングの使用、高度なプログラミングモデル、一貫した抽象化の使用など、最新のコンセプトを備えたツールではありませんか?確かに(たとえばJavaの場合)冗長な型宣言が必要ないことが多いため、混乱が少なくなりますが、静的型付けのその他の利点を失うことなく、型推論を使用する静的型付け言語のほとんどの型宣言を省略することもできます。そして、これらのすべては、Scalaのような最新の静的型付け言語でも利用可能です。 それでは、動的型付けの生産性のために、型モデル自体の利点であると言えるものは何ですか? 明確化:クイックハックよりも大/中規模のプロジェクトに興味があります。:-)

14
ほとんどのログファイルがバイナリ形式ではなくプレーンテキストを使用するのはなぜですか?
ロギングは必要ですが、(比較的)ほとんど使用されません。そのため、ストレージの点ではるかにコンパクトにできます。 たとえば、ip、date、timeなどの最も一般的にログに記録されるデータは、整数として表すことができ、テキストとして保存されています。 ロギングがバイナリデータとして保存されている場合、多くのスペースを保存できるため、特に書き込みが制限されているSSDでは、回転が少なく、ディスクの寿命が長くなります。 それほど重要ではない小さな問題だと言う人もいるかもしれませんが、そのようなメカニズムを構築するために必要な労力を考慮すると、それは意味がありません。誰でも2日間ほど空いた時間にこれを作成できます。なぜこれをしないのですか?
81 logging  storage 

9
このような場合に必要な最小限のデータを常に関数に渡す必要があります
IsAdminユーザーが管理者であるかどうかをチェックする機能があるとしましょう。また、管理者チェックは、ユーザーID、名前、およびパスワードを何らかのルール(重要ではない)と照合することで行われるとしましょう。 私の頭の中には、このための2つの可能な関数シグネチャがあります。 public bool IsAdmin(User user); public bool IsAdmin(int id, string name, string password); 私は次のことを考えて、ほとんどの場合、2番目のタイプの署名を使用します。 関数の署名は、読者により多くの情報を提供します 関数内に含まれるロジックは、Userクラスについて知る必要はありません 通常、関数内のコードはわずかに少なくなります しかし、私は時々このアプローチに疑問を呈し、またある時点でそれが扱いにくくなることを認識しています。たとえば、関数が10個の異なるオブジェクトフィールド間を結果boolにマップする場合、私は明らかにオブジェクト全体を送信します。しかし、そのような厳格な例は別として、実際のオブジェクトを渡す理由がわかりません。 どちらのスタイルについても議論があれば、また一般的な意見をいただければ幸いです。 私はオブジェクト指向スタイルと機能スタイルの両方でプログラミングしているので、質問はありとあらゆるイディオムに関するものと見なされるべきです。

7
依存性注入または静的ファクトリーを使用する必要がありますか?
システムを設計するとき、他のモジュールで使用されているモジュール(ロギング、データベースアクセスなど)の問題にしばしば直面します。問題は、これらのコンポーネントを他のコンポーネントに提供する方法です。依存性の注入またはファクトリパターンの使用の2つの答えが考えられます。ただし、両方とも間違っているようです: 工場はテストを困難にし、実装の簡単な交換を許可しません。また、依存関係を明示しません(たとえば、データベースを使用するメソッドを呼び出すメソッドを呼び出すメソッドを呼び出すという事実を知らないメソッドを調べています)。 Dependecyインジェクションは、コンストラクター引数リストを大幅に膨張させ、コード全体にいくつかの側面を塗りつけます。典型的な状況は、半分以上のクラスのコンストラクターがこのように見える場合です(....., LoggingProvider l, DbSessionProvider db, ExceptionFactory d, UserSession sess, Descriptions d) 問題がある典型的な状況を次に示します。データベースからロードされたエラー記述を使用する例外クラスがあり、ユーザーセッションオブジェクトにあるユーザー言語設定のパラメーターを持つクエリを使用します。したがって、新しい例外を作成するには、データベースセッションとユーザーセッションを必要とする説明が必要です。したがって、例外をスローする必要がある場合に備えて、これらすべてのオブジェクトをすべてのメソッドにドラッグする運命にあります。 このような問題にどのように取り組むのですか?


12
あなたよりも経験のある人にどのようにインタビューしますか?[閉まっている]
私が働いている会社は、私よりも経験のある上級開発者を雇いたいと考えており、インタビューの技術的な部分を私に任せることを期待しています。プログラミングを始めて数年になりますが、自分よりも理解/経験のある人のコーディングスキルを評価するために必要な知識があるかどうかはわかりません。 技術的なインタビューの質問を推奨して、より高いレベルのプログラミングスキルを評価するための良い手段ですが、それでも理解できるものはありますか? 私はjrを過ぎていると言うでしょう。プログラマーレベルですが、シニアに近いところはありません。私がやったことのほとんどは、小さなアプリ(Webおよびデスクトップ)を作成することで、その一部はかなり複雑ですが、それらはすべて、ほんの少数のユーザーが使用することを意図しています。私はほとんどのプログラミング概念を十分に理解しており、あらゆることについて自分で学習/指導できると感じていますが、経験が不足しています。私の上司は「あなたはあなたが知らないことを知らない」と言うのが好きです。 特に、私が雇った経験のない人(私が持っていないもの)は、多層開発、マルチユーザー環境、大規模アプリケーション開発、双方向メッセージング、共有セッション、およびマルチスレッド/ BackgroundWorkers。 更新: 以下のThorのコメントに応えて、私たちは数ヶ月前に誰かを雇いました。コーディングだけでなく、デザインパターン、ソフトウェアアーキテクチャ、ドキュメント、その他の大規模なプログラミングチームがどのように作業を行うかなどについても、多くのことを学んでいます。誰かがやって来て、自分がやったことをするためのより良い方法を指摘することは必ずしも容易ではありませんが、あなたが誇りを飲み込み、新しいことを試してみようとすることができれば、多くを学ぶことができます。 面接のプロセスは思ったよりもうまくいきました。慣れ親しんだことについて質問し始め、苦労していたことについて質問しました。インタビュイーがわからないことを言ったときはいつでも、説明してもらい、後で調べられるように書き留めるように頼みました。全体として、申請者のスキルレベル、知性、そして彼らがどのような仕事をしたいかについてかなり良いアイデアを得ることができたと感じました。
81 interview 

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