ソフトウェア工学

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

1
私のgithubプルリクエストはマージされましたが、この段階での規約は何ですか?
Githubでプロジェクトを分岐し、小さな変更を加えて、プルリクエストを元のメンテナーに送信しましたMerged pull request #11 from my_username/master。 これは私がこれをしているのは初めてなので、エチケットが今何であるのかわかりません:私はgit pull upstream masterそれからをしましたgit push origin master、そして今私自身のリポジトリの最後のコミットは私Merged pull request #11 from my_username/masterにはかなり奇妙に感じます。これは人々が通常行う方法ですか、「歴史をきれいにする」ために何かする必要がありますか? 注:これは小さなドキュメントの変更であったため、ブランチを作成していませんでした。ブランチに変更を加えmaster、プルリクエストを送信しました。そのため、その部分で実行するクリーンアップはありません。

7
オブジェクトを変更するメソッドにオブジェクトを渡すことは、一般的な(アンチ)パターンですか?
Martin FowlerのRefactoring bookで一般的なコードのにおいについて読んでいます。その文脈で、私はコードベースで見ているパターンについて疑問に思っていました、そしてそれが客観的にそれをアンチパターンと考えることができるかどうか。 パターンは、オブジェクトが1つ以上のメソッドへの引数として渡されるものであり、それらはすべてオブジェクトの状態を変更しますが、いずれもオブジェクトを返しません。そのため、(この場合は)C#/。NETの参照によるパスに依存しています。 var something = new Thing(); // ... Foo(something); int result = Bar(something, 42); Baz(something); (特にメソッドに適切な名前が付けられていない場合)そのようなメソッドを調べて、オブジェクトの状態が変化したかどうかを理解する必要があることがわかりました。複数レベルの呼び出しスタックを追跡する必要があるため、コードの理解がより複雑になります。 このようなコードを改善して、新しい状態の別の(クローンされた)オブジェクト、または呼び出しサイトでオブジェクトを変更するために必要なものを返すことを提案したいと思います。 var something1 = new Thing(); // ... // Let's return a new instance of Thing var something2 = Foo(something1); // Let's use out param to 'return' other info about the …

2
独自の音声認識コードの作成[終了]
閉じた。この質問はより集中する必要があります。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集するだけで1つの問題に焦点を当てるように質問を更新します。 4年前に閉鎖されました。 問題の説明 ハードウェアプロジェクトの一部として音声認識を使用したいのですが、完全に自己完結型にしたいです(ArduinoやRaspberry Pi、Kinectsなどの小さな低電力、低速のデバイスを使用しています。 OSが関係しているため、クローズド/自己完結型プロジェクト)。 音声認識は、希望する洗練度によっては非常に複雑になる場合があります。私は、比較的単純な要件のセットを信じています。自分の声だけを認識したいのですが、認識したい20語ほどの小さな辞書があります。したがって、複雑な音声テキスト変換や音声認識ライブラリや、インターネット検索エンジンで見つけた優れたサードパーティソフトウェアは必要ありません(これらに不足はありません!)。私の要件は「十分に単純」で(理由の範囲内で)、自分のソリューションをコーディングできると考えています。私は誰かがこのような独自のプロセスを書いているのだろうかと思っていますが、私の方法は非常に欠陥がありますか?高レベルの数学を必要とせずに、または複雑なアルゴリズムを記述する必要なく、これを行うより良い方法はありますか? それが私が以下で考えようとした解決策です。 ソリューションの説明 私はこれをCで書くつもりですが、言語にとらわれないプロセスについて議論し、そのプロセスに焦点を当てたいと思います。可能な場合は無視してください。 1 話されている単語と一致するように単語の辞書を事前に記録します。20の異なる単語の20の録音、または2つまたは3つの単語の短いフレーズまたは文章があると想像できます。これにより、実際にオーディオをテキストに変換して2つの文字列を比較するよりも、2つの録音ファイルを比較するプロセスが簡単になると思います。 2。コードを実行しているハードウェアデバイスにマイクが接続されています。[1]。コードは、たとえば長さが10ミリ秒の固定長のサンプルを連続的に取得し、たとえば循環ログ形式で10の連続したサンプルを保存します。[2]。(これらの数字を頭の外で発明しているので、これらはプロセスを説明するための例にすぎません)。 [1]これはおそらく、辞書録音が行われるように、バンドパスフィルターとオペアンプを介して接続され、保存および収集されたオーディオサンプルを小さく保ちます。 [2]サンプルをどのように取得するか正確にはわかりません。10msecサンプル(おそらくCRC値)のオーディオを表す数値(整数/浮動小数点/倍精度)を生成していましたが、メソッドを実行する必要がありますまたはオーディオサンプルのMD5合計など)、または数字のストリーム(おそらく周波数のオーディオ測定値のストリーム)。最終的に、「サンプル」は数値または数字になります。この部分は、はるかに多くのハードウェアが関係するため、ここでの説明にはあまり適していません。 3。コードは、10個の連続したサンプルが格納されていることを確認し、単語またはフレーズが言われていることを示すボリュームの増加(無音からの中断)を探してから、たとえば500個のサンプルなどの連続したサンプルを収集します。つまり、10ミリ秒のサンプルで5秒間のオーディオをキャプチャします。 保存されたサウンドとキャプチャされたサウンドを比較するのは、これらのサンプルまたは「スライス」です。キャプチャされたサンプルの十分に高い割合が、保存されている同等のサンプルと一致した場合、コードは同じ単語と見なします。 The start of a store recording of the world "hello" for example, stored words are split into 10 msec samples also Stored Sample No | 1| 2| 3| 4| 5| 6| 7| …

4
レコードが日付で識別できる場合、データベースにIDが必要ですか?
私はAndroid向けの最初のアプリケーションを作成しており、SQLiteデータベースを使用するため、できるだけサイズを制限しようとしていますが、この質問は一般的にデータベース設計に当てはまると思います。 テキストと作成日を含むレコードを保存する予定です。このアプリはスタンドアロンアプリです。つまり、インターネットにリンクせず、1人のユーザーのみが更新するため、特定の日付に複数のエントリが存在する可能性はありません。 テーブルにはまだID列が必要ですか?その場合、日付ではなくIDをレコード識別子として使用する利点は何ですか?
17 database 

4
多くのプログラミング言語でmod(%)が基本的な数学演算子であるのはなぜですか?
モジュラス演算子が多くの言語のように見える標準演算子の小さなセットの一部である理由は、歴史的であろうとなかろうと、ありますか?(+, -, *, /および%、JavaおよびCの場合**、RubyおよびPythonの場合)。 modを「基本」として含めるのは奇妙に思えます(たたくのではなく、たくさん使いますが、累乗、絶対値、下限/天井なども使用します。これは、Java、C、Ruby、Pythonがすべて従う特定の仕様で行われた古い決定でしたか、それともすべての派生言語ですか?私の知る限り、ほとんどのLisp方言には+, -, /とのみが含まれてい*ます。 最初は、modがバイナリレベルで実装するのが特に簡単かどうか疑問に思いました(「基本的な」演算子とすべきでないものに関する決定に関して違いが生じるのでしょうか)。それは私が考えるよりもプログラミングではるかに一般的に使用されていますか?

4
標準に準拠する必要がありますか?
Stack Overflowには、C標準について常に語る経験豊富な人々がいます。たとえ私のために働いていても、人々は非ポータブルなソリューションを好まないようです。わかりました、標準に従う必要があることを理解していますが、プログラマーの創造性に束縛をかけませんか? 標準に従うことから得られる具体的な利点は何ですか?特に、コンパイラは標準をわずかに異なる方法で実装する場合があるためです。

5
インターフェイスを使用する場合(ユニットテスト、IoC?)
私はここで男子学生の間違いを犯したのではないかと疑い、明確化を求めています。私のソリューションの多くのクラス(C#)-あえて過半数を言う-私は対応するインターフェースを書くことになりました。たとえば、「ICalculator」インターフェースと、それを実装する「Calculator」クラス。ただし、その計算機を別の実装に置き換えることは決してないでしょう。また、これらのクラスのほとんどは、依存関係と同じプロジェクトに存在します。実際に必要なのはinternal、必要なだけですが、publicそれぞれのインターフェイスを実装する副作用として存在することになりました。 すべてのインターフェイスを作成するこのプラクティスは、いくつかの偽りに起因すると思います。 1)元々、ユニットテストモックを作成するにはインターフェイスが必要だと思っていました(私はMoqを使用しています)が、その後、そのメンバーがvirtualであり、パラメーターのないコンストラクターがある場合、クラスをモックできることがわかりました(私が間違っている)。 2)IoCフレームワーク(Castle Windsor)にクラスを登録するにはインターフェースが必要だと当初考えていました。例えば Container.Register(Component.For<ICalculator>().ImplementedBy<Calculator>()... 実際、私はそれ自体に対して具体的な型を登録することができました: Container.Register(Component.For<Calculator>().ImplementedBy<Calculator>()... 3)依存性注入のコンストラクタパラメーターなどのインターフェイスを使用すると、「疎結合」になります。 それで、私はインターフェースに夢中になりましたか?!私は、あなたが「通常」インターフェースを使用するシナリオを知っています。例えば、パブリックAPIを公開したり、「プラグイン可能な」機能のようなもののために。私のソリューションには、そのようなユースケースに適合する少数のクラスがありますが、他のすべてのインターフェースは不要であり、削除する必要があるのでしょうか?上記の3)に関して、これを行う場合、「疎結合」に違反しませんか? 編集:-Moqで遊んでいるだけであり、それらをモックできるようにするには、メソッドがパブリックで仮想であり、パブリックのパラメータレスコンストラクターを必要とするようです。それで、私は内部クラスを持つことができないように見えますか?

9
測定単位にアクセスするためのデータ構造
TL; DR-最適なデータ構造を設計して、測定単位内の単位を定義しようとしています。 A Unit of measureは、本質的ににvalue関連付けられた(または数量)unitです。 SIユニットには7つのベースまたはディメンションがあります。すなわち:長さ、質量、時間、電流、温度、物質の量(モル)、および光度。 これは十分に簡単ですが、多くの派生ユニットと頻繁に使用するレートがあります。結合されたユニットの例はNewton:でkg * m / s^2あり、レートの例はですtons / hr。 暗黙のユニットに大きく依存するアプリケーションがあります。変数または列名に単位を埋め込みます。しかし、異なる単位で測定単位を指定する必要がある場合、これは問題を引き起こします。はい、入力および表示時に値を変換できますが、これにより、独自のクラス内にカプセル化する多くのオーバーヘッドコードが生成されます。 コードプレックスやその他の共同作業環境には多くのソリューションがあります。プロジェクトのライセンスは同意できますが、プロジェクト自体は通常、非常に軽量または重すぎます。「ちょうどいい」というユニコーンを追いかけています。 理想的には、次のようなものを使用して新しい測定単位を定義できます。 UOM myUom1 =新しいUOM(10、ボルト); UOM myUom2 = new UOM(43.2、Newtons); もちろん、クライアントのニーズに基づいて、ImperialユニットとSIユニットを組み合わせて使用​​します。 また、このユニットの構造を将来のデータベーステーブルと同期させて、データ内で同じ程度の一貫性を提供する必要があります。 測定単位クラスを作成するために使用する必要がある単位、派生単位、およびレートを定義する最良の方法は何ですか?1つ以上の列挙型を使用していることはわかりましたが、他の開発者にとってはイライラする可能性があります。単一の列挙型は200以上のエントリで巨大になりますが、複数の列挙型はSIと帝国のユニットに基づいて混乱し、ユニット自体の分類に基づいた追加の内訳があります。 私の懸念のいくつかを示す列挙型の例: myUnits.Volt myUnits.Newton myUnits.meter SIUnit.meter ImpUnit.foot DrvdUnit.Newton DrvdUnitSI.Newton DrvdUnitImp.FtLbs 使用中のユニットのセットはかなり明確に定義されており、有限のスペースです。クライアントから需要がある場合、新しい派生ユニットまたはレートを拡張および追加する機能が必要です。このプロジェクトはC#で作成されていますが、より広範な設計の側面は複数の言語に適用できると思います。 私が調べたライブラリの1つでは、文字列を介したユニットの自由形式の入力が可能です。次に、UOMクラスは文字列を解析し、それに応じてスロットを割り当てました。このアプローチの課題は、正しい文字列形式が何であるかを開発者に考えさせ、記憶させることです。そして、コンストラクターで渡される文字列を検証するためにコード内に追加のチェックを追加しないと、ランタイムエラー/例外のリスクが発生します。 別のライブラリは、開発者が作業しなければならないクラスを本質的に多く作成しました。同等のUOMとともに、DerivedUnitなどRateUnitを提供しました。基本的に、コードは、私たちが解決しようとしている問題に対して非常に複雑でした。そのライブラリは基本的にany:anyの組み合わせ(ユニットの世界では合法です)を許可しますが、可能なすべての組み合わせを許可しないことで問題の範囲を広げることができます(コードを簡素化します)。 他のライブラリはとてつもなくシンプルで、たとえば演算子のオーバーロードも考慮していませんでした。 さらに、誤った変換(たとえば:ボルトからメートル)の試みについても心配していません。この時点でこのレベルでアクセスできるのは開発者だけであり、これらのタイプの間違いから保護する必要は必ずしもありません。

4
非機能言語での永続データ構造の使用
純粋に関数型またはほぼ純粋に関数型の言語は、不変であり、関数型プログラミングのステートレススタイルによく適合するため、永続的なデータ構造の恩恵を受けます。 ただし、Javaのような(状態ベース、OOP)言語の永続データ構造のライブラリが時々見られます。永続的なデータ構造を支持してよく聞かれる主張は、不変であるためスレッドセーフであるということです。 ただし、永続データ構造がスレッドセーフである理由は、1つのスレッドが永続コレクションに要素を「追加」すると、操作は元の要素に要素が追加された新しいコレクションを返すためです。したがって、他のスレッドは元のコレクションを参照します。もちろん、2つのコレクションは多くの内部状態を共有しています。そのため、これらの永続的な構造は効率的です。 しかし、スレッドごとにデータの状態が異なるため、永続データ構造だけでは、あるスレッドが他のスレッドに見える変更を行うシナリオを処理するのに十分ではないように思われます。このためには、アトム、リファレンス、ソフトウェアトランザクションメモリ、またはクラシックロックや同期メカニズムなどのデバイスを使用する必要があるようです。 それでは、なぜPDSの不変性が「スレッドセーフ」にとって有益であると宣伝されているのでしょうか。PDSが同期、または並行性の問題の解決に役立つ実際の例はありますか?または、PDSは、関数型プログラミングスタイルをサポートするオブジェクトへのステートレスインターフェイスを提供する単なる方法ですか?

5
コードにデータを保存する
過去に何度か、データをコードに保存したいと思っていました。これはめったに変更されないデータであり、データベースへのアクセスが不可能、実用的、または望ましくない場所で使用されます。小さな例は、国のリストを保存することです。そのためには、次のようなことができます。 public class Country { public string Code { get; set; } public string EnglishName {get;set;} } public static class CountryHelper { public static List<Country> Countries = new List<Country> { new Country {Code = "AU", EnglishName = "Australia"}, ... new Country {Code = "SE", EnglishName = "Sweden"}, ... }; public …
17 c# 

4
Javaのように、Scalaがパッケージのインポートに「*」ではなく「_」演算子を使用するのはなぜですか?
私の意見では、Scalaの最大の利点の1つは、Javaとの相互運用性および類似の構文です。奇妙なことに_気づい*たのは、Javaで使用されている演算子の代わりに、パッケージウィルカードのインポートに演算子を使用していることです。 の_代わりに使用する技術的な理由はあり*ますか?そうでない場合、なぜこの変更が行われたのですか?
17 java  scala 

5
C ++のすべてにオブジェクト(プリミティブ型ではなく)を使用するのは理にかなっていますか?
私が取り組んでいる最近のプロジェクトでは、次のような多くの関数を使用する必要がありました。 static bool getGPS(double plane_latitude, double plane_longitude, double plane_altitude, double plane_roll, double plane_pitch, double plane_heading, double gimbal_roll, double gimbal_pitch, double gimbal_yaw, int target_x, int target_y, double zoom, int image_width_pixels, int image_height_pixels, double & Target_Latitude, double & Target_Longitude, double & Target_Height); だから私はこのように見えるようにそれをリファクタリングしたい: static GPSCoordinate getGPS(GPSCoordinate plane, Angle3D planeAngle, Angle3D gimbalAngle, PixelCoordinate …

7
Pythonはブラウザでクライアント側で使用するには遅すぎますか?
Pythonはブラウザーで使用するには遅すぎるという声明を聞きました。 Javascriptはこの点で優れていると思うのは、グーグルのような企業が生き残るためにそれを必要としているので、それを速く必要としている(そして速くした)からです。 PythonとJavascriptの設計方法に違いがあり、それらがブラウザでどのように機能するか(影響するか)に影響はありますか? 今のところクライアント側のPython実装はないので、私の質問は誰かの声明から来ているので、言語自体と関係があるのか​​もしれません(信じられませんが)。

4
コードの安定性を測定するためのソースコードメトリック?
リリースサイクル(実装、テスト、バグ修正、リリース)でソフトウェアがどのように開発されるかを考えると、コードベースで変更されるコードの行に何らかのパターンが見えるはずだと考えていました。たとえば、プロジェクトの終わりに向かって、コードがより安定した場合、単位時間あたりに変更されるコードの行が少なくなることがわかります。 たとえば、プロジェクトの最初の6か月の平均は1日あたり200行のコードでしたが、先月は1日あたり50行のコードであり、先週(製品DVDの直前)出荷された)、コードの行はまったく変更されていません(コードのフリーズ)。これは単なる例であり、特定のチームが採用した開発プロセスに応じてさまざまなパターンが出現する可能性があります。 とにかく、単位時間あたりのコードの修正行数を使用してコードベースの安定性を測定するコードメトリック(それらに関する文献はありますか)はありますか?プロジェクトがどこかで手に入れようとしている場合や、リリースの準備がまだ整っていない場合に、感覚をつかむのに役立ちますか?バージョン管理システムからこの情報を抽出し、統計を生成できるツールはありますか?

6
キャッシュを多用する単体テスト方法のベストプラクティス
私は、キャッシュからオブジェクトとオブジェクトのリストを(フィルターを使用して)保存および取得するビジネスロジックメソッドをいくつか持っています。 検討する IList<TObject> AllFromCache() { ... } TObject FetchById(guid id) { ... } IList<TObject> FilterByPropertry(int property) { ... } Fetch..そして、Filter..呼んでAllFromCache、それがない場合、キャッシュとリターンを移入し、ちょうどそれがある場合、そこから返していました。 私は通常、これらの単体テストを避けます。このタイプの構造に対する単体テストのベストプラクティスは何ですか? TestInitializeでキャッシュにデータを追加し、TestCleanupでキャッシュを削除することを検討しましたが、それは私には適切ではないと感じました(そうかもしれません)。

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