ソフトウェア工学

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

5
「純粋なオブジェクト指向言語」という用語の正式な定義は?
私はそのような質問を提起するためにSO兄弟の間でより良い場所を考えることができません。もともと「Pythonは純粋なオブジェクト指向言語ですか?」しかし、用語を定義しようとする際に人々が経験するトラブルや不快感を考慮して、用語自体の明確な定義を取得することから始めることにしました。 言葉を作り出したアラン・ケイ博士による通信から始めるのはかなり公平でしょう(細胞または他の生物との生物学的類推のインスピレーションに注意してください)。 タスクにアプローチするには、次の方法があります。 用語を定義するために一意で十分な特定のプロパティを示す(またはそうしない)プログラミング言語をリストして比較分析を行います(ただし、Smalltalk、Scala、Javaなどは可能ですが、IMOはこのように完全には見えません)実りもありません) 正式な定義(またはそれに近い、たとえば、より学術的または数学的なスタイル)を提供します。 具体的な言語のセマンティックコンテキストまたはアプリオリなプログラミングエクスペリエンスに完全に依存する哲学的定義を提供します(コミュニティによる説明が成功する可能性があります)。 私の現在のバージョン:「操作とオペランドを(文法的に)区別し、このタイプがオブジェクト(OOPの意味)であるかどうかを各オペランドのタイプについて推測できる特定のプログラミング(フォーマル)言語がオブジェクトであるこの言語に少なくとも1つのタイプがある限り、そのような言語はオブジェクト指向言語です。最後に、言語のすべてのタイプがオブジェクトでもある場合、そのような言語を純粋な(強い)オブジェクト指向言語と定義します。 それの可能な改善を感謝します。ご覧のように、「オブジェクト」という用語に依存する定義を作成しました(多くの場合、オブジェクトのクラスとして完全に参照されます)。 [編集] また、私はの(幸運にもよく理解)という概念を使用タイプを型付けの言語のように。データ型プログラミングまたは型指向プログラミングは、(プログラムテキスト、つまりリテラルおよびデータ変数の特定の値をどのように処理するか-タイプセーフティに進化するもの)の構文解釈であるだけでなく、言語文法に起因し、正式な方法で研究できる(数学的論理を使用)いわゆる型システムとして。特定の型システムにいわゆるユニバーサル型を要求することは、OO言語の純度を定義する方法の1つです(これを意味的に拡張する方法があります)。 NB 答える方法: 用語や概念の理解をサポート/説明する本または参考文献を指定すると役立ちます(通常、基本を除くすべての依存概念を適切な定義がカバーまたは参照します)。 可能であれば、明確でない場合はインデントされた回答/定義のカテゴリを示します(上記を参照:1-言語の例、2-数学的論理、3-技術的な説明とプログラミング哲学) 分類は重要である(とも用語純粋-OOは、長期OOに含まれているため)他のよく知られた方法論からOOパラダイムのunmix要素に試して答えながら(と決して混乱/それらをオーバーラップする、の例えば通常の要素モジュールをカバーすることができます/オブジェクト指向プログラミングで具体化):OOPと機能プログラミング、論理プログラミング(特に強く専門化された)、Abstarct Data Types(ADT)、Modular、Metaprogramming(generics and LISP's macroexpansion-time)との区別を試みる、契約(例:エッフェル)、アスペクト指向(AO)、(宣言的分類と機能的分類の違い、およびダイクストラの構造化の歴史的定義は明確です) 正式な定義を与えることの難しさ:驚くべきことに、特定の論理(正式な)システムの形式でOOPの数学的な記述を与えることは非常に簡単です(ほとんどの場合、型ベース)。その形式主義を単にエンターテインメントやエクササイズだけでなく、タイプセーフティチェックや新しい言語デザインの側面に適用することにより、より実用的なことを試みることもできます(また、ラムダ計算としてのFOL形式で、直観的型理論、依存型、そして単にカテゴリー理論を使用して)。ここでの主なポイントは、当然のことです多分、一定の割合の発見を除いて-そのような製剤は、IMO強く、最も可能性の高い最初は不完全なので、ほとんどの世界をプログラミングに後方貢献していない((コンピューター・エンジニアリングで)OOPの理解と、その後はほぼアクセスできなくなってしまうことで(不備)バイアスされていることにより、バック正式な世界からの用途一般的な言語に統合されています)。 そうです、定義だけでなく、正確に「良い」定義を与えることは困難です。しかし、皆さんの経験と直接的な関与のおかげで、ここでこれを尋ねることに前向きです。

3
Rubyでデスクトップアプリケーションを作成できますか?[閉まっている]
閉まっている。この質問はトピック外です。現在、回答を受け付けていません。 この質問を改善したいですか? 質問を更新して、 Software Engineering Stack Exchangeのトピックになるようにします。 6年前に閉鎖されました。 Ruby on RailsフレームワークはWeb開発専用であり、デスクトップアプリケーション開発には適していないことを知っています。しかし、Rubyプログラマーがデスクトップアプリケーションを開発したい場合、Rubyのみで実行するのが適切であり、望ましいですか(jRubyではなく、jRubyのチュートリアルがほとんどです)?はいの場合、いくつかの良いチュートリアルを提供してください。開発用のOSとしてLinuxを使用したい。 私はルビー開発者であり、デスクトップアプリケーションを開発したいので、何か提案してください。

4
インターフェイスが他のインターフェイスを拡張する必要があります(そうすることでメソッドを継承します)
これは一般的な質問ですが、私が現在経験している問題にも固有のものです。現在、ソリューションに指定されているインターフェイスがあります public interface IContextProvider { IDataContext { get; set; } IAreaContext { get; set; } } このインターフェイスはプログラム全体でよく使用されるため、必要なオブジェクトに簡単にアクセスできます。しかし、プログラムの一部のかなり低いレベルでは、IAreaContextを使用し、それからいくつかの操作を実行する別のクラスにアクセスする必要があります。そこで、この作成を行うための別のファクトリインターフェイスを作成しました。 public interface IEventContextFactory { IEventContext CreateEventContext(int eventId); } IContextProviderを実装し、NinJectを使用して注入されるクラスがあります。私が抱えている問題は、このIEventContextFactoryを使用する必要がある領域がIContextProviderにのみアクセスでき、それ自体がこの新しいインターフェイスを必要とする別のクラスを使用することです。IEventContextFactoryのこの実装を低レベルでインスタンス化する必要はなく、むしろIEventContextFactoryインターフェース全体で動作します。ただし、コンストラクタを介して別のパラメータを挿入する必要はありません。それを必要とするクラスに渡すだけです。つまり、 // example of problem public class MyClass { public MyClass(IContextProvider context, IEventContextFactory event) { _context = context; _event = event; } public void DoSomething() …
13 c#  design  interfaces 

5
関数型プログラミングの読みやすさ[終了]
閉じた。この質問はより集中する必要があります。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集するだけで1つの問題に焦点を当てるように質問を更新します。 2年前に閉店。 私はこれに興味があります。関数型言語を学ぶ前に思い出したので、それらはすべて恐ろしく、ひどく、ひどく読めないと思っていました。Haskellとf#を知ったので、少ないコードを読むのに少し時間がかかりますが、その小さなコードは命令型言語での同等の量よりもはるかに多いので、純益のように感じ、私は極端ではありません機能的に実践。 ここに私の質問があります。私は、OOPの人々から、機能的なスタイルはひどく読めないと常に聞いています。これが事実であり、自分を欺いているのか、または関数型言語を習得するのに時間がかかったのであれば、スタイル全体がOOPよりも読みにくくなるのではないかと思います。 誰かが証拠を見たり、逸話を手に入れたりして、おそらくこれを言うのに十分な頻度で行っていますか?機能的に実際に書くのが読みにくい場合は、使い続けたくありませんが、そうなのかどうかはわかりません。

2
StringBuilderまたはStringBufferはいつ使用する必要がありますか?
実稼働Webアプリケーションでは、私の仲間のプログラマーがStringBufferをどこでも使用していました。現在、アプリケーションの開発と修正を担当しています。StringBuilderとStringBufferを読んだ後、すべてのStringBufferコードをStringBuilderに置き換えることにしました。これは、データBeanでスレッドセーフが必要ないためです。 例:(各データBeanでStringBufferの使用を確認できます) @Override public String toString() { StringBuffer sb = new StringBuffer();// replace it from StringBuilder sb.append(" ABCD : ").append(abcd); sb.append(", EFGH : ").append(efgh); sb.append(", IJKL : ").append(ijkl); } セッション/リクエストごとに個別のデータBeanを作成します。セッションは、他のユーザーがアクセスできない単一のユーザーによって使用されます。 移行する前に他の点を考慮する必要がありますか? 単一のスレッドがある場合(待機中のスレッドがないか、新しいスレッドがオブジェクトロックを探していない場合)、StringBufferまたはStringBuilderのどちらでも同様に実行されます。StringBufferの場合、オブジェクトロックを取得するのに時間がかかることは知っていますが、オブジェクトロックの保持/解放を除いて、それらの間にパフォーマンスの違いがあるかどうかを知りたいです。

4
インタビュアーがコードを読むように申請者に求めないのはなぜですか?[閉まっている]
閉じた。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して事実と引用で答えられるように質問を更新してください。 4年前に閉鎖されました。 私は人生で数十回のインタビューを受けました(卒業しようとしています)が、なぜコードを読んで説明するように一度しか頼まれなかったのでしょうか。大体、90%の仕事は既存のシステムの維持に関するものです。他の人のコードを読み取るIMOの能力は重要なスキルです。 インタビュアーがチェックしないのはなぜですか?* * 友達の中では、コードのレビューを依頼されたのは私だけです。

3
コードメンテナーの役割からどのように抜け出しますか?[閉まっている]
現在のところ、この質問はQ&A形式には適していません。回答は事実、参考文献、または専門知識によってサポートされると予想されますが、この質問は議論、議論、世論調査、または広範な議論を求める可能性があります。この質問を改善し、場合によっては再開できると思われる場合は、ヘルプセンターをご覧ください。 7年前に閉鎖されました。 私の最後の3つの仕事では、コードメンテナーでした。3つのすべてのケースで、プロジェクトのコードの大部分が既に書かれた後、私は雇われました。 私は独学のプログラマーです。初めてのプロの仕事を始める前に、私は自分のベルトの下で十数個のプロジェクトを開始し、成功して出荷しました。 新しいコードの作成と既存のコードの保守は、まったく異なる2つの仕事です。航空技術者と航空機整備士を比較するようなものです。 特に、飛行機を何らかの方法で論理的または保守しやすいように設計することを試みなかったエンジニアによって設計された飛行機で作業する航空機整備士である場合、それは残念です。 プロジェクトが最初に開始されたとき、私は周りにいるように感じ始めています。あなたは何らかの形でコンピュータサイエンス分野の人々の残りを超越した特別な人々の一人でなければなりません。その位置にいるには何が必要ですか? この質問には本当に簡単な答えはないように感じますが、誰かが私に洞察を与えることができますか?新しいプロジェクトの1階に行ったことはありますか?そこに着くのに何が必要でしたか?

6
コレクションのリクエストにアイテムが含まれない場合の予期される動作
次のものが与えられたとしましょう... List<Thing> theThings = fubar.Things.All(); 返すものが何もない場合、fubar.Things.All()が何を返すと期待しますか? 編集:意見をありがとう。少し待って、アップの多いエントリーを受け入れます。 私はこれまでの回答、特に空のコレクションを示唆するものに同意します。ベンダーは、上記の例に類似したいくつかの呼び出しでAPIを提供しました。昨年、APIを通じて460万ドルの収益を上げたベンダー、BTW。彼らは私が根本的に反対することをします-例外を投げます。
13 java  c# 

6
プログラミングの問題はすべてアルゴリズムの問​​題ですか?[閉まっている]
閉じた。この質問はより集中する必要があります。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集するだけで1つの問題に焦点を当てるように質問を更新します。 5年前に閉鎖されました。 Cormenらによる「アルゴリズムの紹介」が好きです。知識を伝えます。1つの理由は、すべてがプログラミングの問題に関係しており、本が特定のプログラミング言語で実装されていないことです。この言語の独立性は、一般的なアイデアに焦点を当てています。 ですから、私の質問は、タイトルにあるとおりです。このアルゴリズム的な方法で考えることで、すべての解決可能なプログラミング問題を解決できます。どの言語、分野などに関係なく?はいの場合、引数を指定し、そうでない場合、引数を指定します! GUI、AI、グラフィックスなどを使用して、多くの複雑なプログラムを実装していません。しかし、これらのタイプの問題は、優れたアルゴリズムを考えることの問題でもありますか?
13 algorithms 

3
Googleマップの「ルート検索」機能をどのようにテストしますか?
(これは良いインタビューの質問になると思いますが、私の場合はそれよりも実用的です。) 数十の化学成分間の非常に長く洗練された化学反応プロセスをモデル化する大規模で複雑なアプリケーションがあります。私たちは、アプリケーションの受け入れテストを設計する段階にありますが、テストするのに手に負えないほどの数の可能性のあるパスにやや気が進まないのです。私たちの状況は、Googleマップの開発チームが「ルートの取得」機能でルート計画アルゴリズムをテストするときに直面したものと非常によく似ていることがわかりました。明らかに、すべての可能なルートをテスト(検証および検証)することはできませんでした。では、どのような状況でもアプリケーションが機能するという自信をどのようにして得たのでしょうか? そして、私は彼らがそれをどのようにしたかを知ることを期待していないので、あなたに尋ねましょう:特定のアプリケーションが堅牢であることを満足させるために、適切なコードカバレッジを備えたテストスイートをどのように設計しますか?システムを通るすべての潜在的な経路を調査するために? 私が探しているのは、手に負えない問題を小さく扱いやすい部分に分解するために使用する原則です。その合計は、全体の満足のいく推定を提供します。「すべてをテストすることはできませんが、これをテストすることはできます、これ、そしてこれで十分です。」「確かに正しい」アプローチを探しているのではなく、実際の予算/時間の制約を考慮して、慎重なアプローチを探しています。 (Googleマップの例を使用して、できるだけ具体的な回答を求めています。)

3
シェルスクリプトのユーザー構成。ベストプラクティス?
ユーザーが設定する必要のあるいくつかの変数を含むシェルスクリプトを作成しています。おそらく一連の質問をすることで、スクリプトをダウンロードして構成するためのインストーラーがあります。問題のスクリプトは、他の開発者を対象としています。 これは、いくつかの方法で実装できます。 スクリプト自体でプレースホルダーを使用し、sedインストール中にそれらを置き換えるために使用します(/programming/415677/how-to-replace-placeholders-in-a-text-fileのようなもの) 長所:すべての変数定義はスクリプト内に含まれています。スクリプトを手動でダウンロードし、インストーラーよりもエディターを好むユーザー向けに変数を構成するのは簡単です。 短所:インストーラーを使用して変数を設定し直すと、変数を再構成するのは困難です。エラーが発生しやすい、より複雑な正規表現を作成しない限り。 configファイルを使用します。基本的に、割り当てのある別のシェルスクリプトを使用sourceして、それを使用します。(そして、おそらくそれを配置し~/.scriptnameますか?メインスクリプトはにコピーされます/usr/local/bin) 長所:スクリプトの再構成は簡単です。メインスクリプトからそれを行うためのパラメータを追加することもできます(おそらく最初のソリューションでも動作しますが、それ自体からスクリプトを編集することは非常に良い考えのようには聞こえません) 短所:スクリプトは2つのファイルに依存するようになり、ユーザーは構成ファイルを作成するためにインストーラーを実行する必要があります。これは、構成ファイルが存在しない場合に構成ファイルを自動生成することで解決できます。ただし、外部の構成ファイルを見つけることは、スクリプトをダウンロードし、編集し、それを実行したいだけのユーザーにとっては依然として面倒です。 また、インストール後にユーザーが構成を管理する方法に関するいくつかのオプション: $ myscript config server.host example.org $ myscript config server.proxypath / home / johndoe / proxyのようなGit $ myscript config server.httppath / home / johndoe / web Interactive $ myscript config サーバーのホスト名を入力します 。example.orgサーバー上のプロキシへのパスを入力します:/ home / johndoe / proxy サーバー上のhttpディレクトリへのパスを入力します:/ home / johndoe / …

4
C ++とJavaの抽象クラス/インターフェースには異なる使用原理がありますか
Herb Sutterによると、実装を可能な限り分離するために、C ++の抽象クラスよりも抽象インターフェイス(すべて純粋な仮想関数)を好むはずです。私は個人的にこのルールが非常に役立つと感じていますが、最近、多くのJavaプログラマーとチームに参加しましたが、Javaコードにはこのガイドラインは存在しないようです。関数とその実装は、非常に頻繁に抽象クラスに配置されます。だから、C ++でさえハーブサッターをすべて間違っているのか、それともJavaと比較してC ++の抽象関数の使用に一般的な違いがあるのか​​。実装コードを持つ抽象クラスは、C ++よりもJavaの方が賢明ですか?

2
Gitでコミットデータをチェックする適切な方法は何ですか?
私の目標は、特定の要件を満たさないコミットデータをチェックし、作成中のコミットまたはリモートリポジトリにプッシュされたコミットを拒否することです。 事前コミットフックを行うことの問題は、事前コミットフックファイルを手動で更新する必要がある多くの人々に展開するのが難しいことです。同様に、Gitでは.gitフォルダーにサブモジュールを配置することはできません。サブモジュールを配置することは非常に簡単ですが、悲しいかな。 私が見る他のオプションは、リモート側の更新フックをチェックインすることです。これは、devによってプッシュされた各コミットをチェックし、コミットのいずれかがテストに失敗した場合にプッシュを拒否します。 誰もこの問題に関する洞察を持っていますか?もしそうなら、更新フックスクリプトの例を提供してくれますか?私はそれがどのように機能するかに関して少し混乱しています。
13 git 

4
デザインパターンが正しく実装されているかどうかを確認する方法
文書化されたデザインパターンを使用していなかったすべての古いアプリケーションを正常にスケーリングできます。どのようなパターンであれ、私は知りません。大部分は、単純なOOPコンセプトを使用する必要があると感じただけです。 デザインパターンの概念は複雑で理解しにくいものです。実装時に、実装が正しく、アプリケーションが実際の疎結合を持っているかどうかを判断する方法は?


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