ソフトウェア工学

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

3
どのプロセスで構文エラーが発生しますか?(トークン化または解析)
私はコンパイルと解釈を理解しようと、段階的に全体像を把握しようとしています。だから、この記事を読んでいる間に質問に思いついた。http://www.cs.man.ac.uk/~pjj/farrell/comp3.htmlこの記事 それは言います: コンパイラの次の段階は、パーサーと呼ばれます。コンパイラのこの部分は、言語の文法を理解しています。構文エラーを特定し、エラーのないプログラムを別の言語で解釈または書き出すことができる内部データ構造に変換する責任があります。 しかし、トークナイザーが構文エラーのある特定のストリームを適切にトークン化する方法を理解できませんでした。 そこにとどまるか、パーサーに間違った情報を提供する必要があります。トークン化は一種の翻訳者でもないのですか? したがって、トークン化中にコードの字句破損行をどのように単に克服するか。 トークナイザーの見出しの上のリンク内にトークンの例があります。 私が理解しているように、トークンの形式は次のように思えます。コードに何か問題があると、トークンも破損します。 私の誤解を明確にしていただけますか?

7
最初にリリースするか、最初にドキュメントを作成しますか?
私は数年前からプロジェクトに取り組んでおり、まともなユーザーベースを集め始めています。いくつかの基本的なドキュメントを含むプロジェクトページを作成しましたが、現時点ではFAQにすぎません。新しいユーザーとパワーユーザーの両方にとってより有益になるように改善する必要があることを知っています。そして、それは次のリリースのToDoリストにあります。 ただし、次のリリースには、ユーザーベースが取得したい機能があります。今すぐリリースする準備ができており、パッケージ化されており、すぐに使用できます。適切な配布サービスに展開するだけです。 ポイントへ。この機能はユーザーにとって重要ですが、ドキュメントは私にとって重要です。ドキュメントを書き直すまでリリースを待つべきですか?私の現在のユーザーベースは、新機能の使用方法を理解するのに十分な知識を持っているので、心配していることではありません。このプロジェクトに取り組む自由な時間は限られているため、ドキュメントを完成させるのに数週間かかる場合がありますが、もう待つようにするとコミュニティは唾を吐きます。 このシナリオで顧客は正しいですか?新規ユーザー向けの堅牢なドキュメントよりも、既存のユーザー向けの素晴らしい単純な機能を優先すべきでしょうか? 更新:うわー、非常に多くの素晴らしい、高品質の応答!プロジェクトとそのユーザーの両方をどのようにやり取りし、サポートする必要があるかについて、あなたが本当に助けてくれました。感謝万円!

1
Reduxのメモリ消費[終了]
閉まっている。この質問はトピック外です。現在、回答を受け付けていません。 この質問を改善したいですか? 質問を更新して、 Software Engineering Stack Exchangeのトピックになるようにします。 閉じた3年前。 Reduxフレームワークは、不変の状態/純粋関数パラダイムを支持します。これは、現在のアクションに関して、前の状態から新しい状態の作成を促進します。このパラダイムの適用可能性は疑う余地がありません。 私の主な懸念は、Reduxレデューサーが呼び出されたアクションごとに以前の状態から新しい新しい状態を熱心に返すため、大量のメモリドレイン(メモリリークと混同しないでください)が多くの実際のアプリケーションで一般的に発生することです。Javascriptアプリケーションは通常、平均的なユーザーのデバイスのブラウザーで実行され、他のいくつかのデバイス固有のアプリケーションと、さらにいくつかのブラウザーのタブとウィンドウも実行できることを考慮すると、メモリを節約する必要性がますます明らかになります。 Reduxアプリケーションのメモリ消費量を従来のFluxアーキテクチャと実際に比較した人はいますか?もしそうなら、彼らは彼らの調査結果を共有できますか?

5
単一の文字に適した検索アルゴリズムはありますか?
KMPやBoyer-Mooreなどの基本的な文字列照合アルゴリズムはいくつか知っていますが、それらはすべて検索前にパターンを分析しますが、1つの文字がある場合、分析することはあまりありません。テキストのすべての文字を比較する単純な検索よりも優れたアルゴリズムはありますか?

5
コンストラクターでセッターを使用することが一般的なパターンにならなかったのはなぜですか?
アクセサーと修飾子(セッターとゲッター)は、次の3つの主な理由で便利です。 これらは変数へのアクセスを制限します。 たとえば、変数にアクセスすることはできますが、変更することはできません。 パラメータを検証します。 彼らはいくつかの副作用を引き起こす可能性があります。 大学、オンラインコース、チュートリアル、ブログ記事、およびWeb上のコード例はすべて、アクセサと修飾子の重要性について強調しています。最近のコードには「必須」のように感じられます。したがって、以下のコードのように追加の値を提供しなくても、それらを見つけることができます。 public class Cat { private int age; public int getAge() { return this.age; } public void setAge(int age) { this.age = age; } } そうは言っても、実際にパラメーターを検証し、無効な入力が提供された場合に例外をスローしたりブール値を返したりする、より有用な修飾子を見つけることは非常に一般的です: /** * Sets the age for the current cat * @param age an integer with the valid values between …

6
あまりにも多くのオーバーヘッドなしでコーディングの進行を意味のあるコミットに分割する
修正または機能の作業をしているとき、数秒でその場で改善できる他の小さな問題に出くわすことがあります。すぐにそれらを行い、完成した機能/修正をコミットすると、コミットには複数のことが含まれます。たとえば"add feature X and code clean up"または"fix bug X and improved logging"。これを2つのコミットに分割することをお勧めします。同じファイルで2つの変更が発生した場合、1つのファイルを追加してコミットし、もう1つのファイルを追加してから再度コミットすることはできません。したがって、次の3つのオプションが表示されます。 何かに取り組んでいる間、無関係なものを故意に見落とします。 2つの変更を加えてファイルをコピーし、元に戻し、1つの変更を含めてコミットし、もう1つの変更を含めて再度コミットします。 関係のない小さなことは変更せずに、todoリストに追加して後で実行します。 次の理由により、3つのオプションのすべてが本当に好きではありません。 小さな問題を解決しないと、コードの品質が低下する可能性があります。そして、多くの努力をせずに何かを改善する機会を意識的に逃した場合、私は気分が悪いです。 これにより、手作業が増え、エラーが発生しやすくなります。 これはあまり手間がかからないTodoには問題ありませんが、ToDoリストに小さなアイテムを追加して後で再訪することは、すぐに修正するよりもはるかに時間がかかります。 そのような状況にどのように対処しますか?

4
インタープリター言語にCIを使用するにはどうすればよいですか?
これまでに継続的インテグレーションシステム(CI)を使用したことがありません。私は主にMATLAB、PythonまたはPHPでコーディングします。これらのどちらにもビルドステップがなく、CIがどのように作業に使用できるかわかりません。大企業の大規模プロジェクトの友人から、言葉は関係ないと言われました。 ビルドステップがない場合、CIがどのように役立つかわかりません。CIは、単体テストを実行するテスト環境と考えることができます。何か不足していますか?

1
.Netの配列にはLengthがあるのに、他のコレクションタイプにはCountがあるのはなぜですか?[閉まっている]
閉じた。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して事実と引用で答えられるように質問を更新してください。 4年前に閉鎖されました。 たとえば、C#では、配列にLengthプロパティがあります。ただし、リストなどの他のコレクションタイプにはCountプロパティがあります。これら2つが異なる理由はありますか?もしそうなら、私は知りたいです。

1
¬とは何で、何のためですか?[閉まっている]
閉まっている。この質問はトピック外です。現在、回答を受け付けていません。 この質問を改善したいですか? 質問を更新して、 Software Engineering Stack Exchangeのトピックになるようにします。 4年前に閉鎖されました。 この質問をグーグルで検索すると、役に立たないことが判明したため、¬シンボルは次のようになります。 それは何のため? なんていうの? プログラミング言語で使用されていますか?

4
キロバイトブロックとポインターのすべての可能な順列のメモリは可能ですか?
これは頭​​をかき回すのに十分なほど難しい考えであり、編集/ヘルプを知っている人にとって読みやすくするためにどんな編集/ヘルプも大いに感謝します。 理論上、1キロバイトのすべての可能なバイナリ順列のコピーを1つ保存したハードドライブを使用し、システムの残りの部分にこれらの場所へのポインターを作成させることは可能ですか? このような方法で作成されたシステムは、単に情報を直接保存するよりも速いでしょうか? 別の方法を説明するには、文章を書く代わりに次のように言います。 「こんにちは、ボブです。」「そのサンドイッチは美味しそうです。」 ...ハードドライブに保存すると、アルファベットやその他の文字のすべての順列が最大数(たとえば1000文字程度)になり、次のような文が保存されます。 [ポインター#21381723]

6
クラスが独自のパブリックメソッドを使用しても大丈夫ですか?
バックグラウンド 現在、デバイスが送信および受信するオブジェクトを持っている状況があります。このメッセージには、次のようないくつかの構成要素があります。 public void ReverseData() public void ScheduleTransmission() ScheduleTransmissionこの方法は、必要呼び出すためにReverseData、それが呼ばれるたびにメソッドを。ただし、アプリケーションでオブジェクトがインスタンス化されている場所からReverseData外部で呼び出す必要がある場合があります(名前空間の外側に完全に追加する必要があります)。 「受信」に関してはReverseData、object_receivedイベントハンドラーで外部から呼び出されて、データを元に戻します。 質問 オブジェクトが独自のパブリックメソッドを呼び出すことは一般に許容されますか?

4
コンストラクターでの正当な「実際の作業」
私はデザインに取り組んでいますが、引き続き障害にぶつかっています。私は特定のクラス(ModelDef)を持っています。これは、本質的にXMLスキーマを解析することで構築された複雑なノードツリーの所有者です(DOMを考えてください)。優れた設計原則(SOLID)に従い、結果のシステムを簡単にテストできるようにします。DIを使用してModelDefのコンストラクターに依存関係を渡すつもりです(テスト中に必要に応じてこれらを簡単に交換できます)。 しかし、私が苦労しているのは、ノードツリーの作成です。このツリーは、個別にテストする必要のない単純な「値」オブジェクトで完全に構成されます。(ただし、これらのオブジェクトの作成を支援するために、Abstract FactoryをModelDefに渡すことができます。) しかし、私は、コンストラクターが実際の作業を行うべきではないことを読み続けています(例:Flaw:Constructor does Real Work)。「実際の作業」とは、後でテストのためにスタブアウトする可能性のある重い依存オブジェクトを構築することを意味する場合、これは私にとって完全に理にかなっています。(これらはDI経由で渡される必要があります。) しかし、このノードツリーなどの軽量の値オブジェクトはどうでしょうか。ツリーはどこかに作成する必要がありますよね?ModelDefのコンストラクター(buildNodeTree()メソッドなどを使用)を使用しないのはなぜですか? ModelDefの外でノードツリーを作成してから(コンストラクターDIを介して)渡したいとは思いません。スキーマを解析してノードツリーを作成するには、かなりの量の複雑なコードが必要です。 。私はそれを「グルー」コードに委ねたくありません(これは比較的簡単なはずで、おそらく直接テストされません)。 ノードツリーを作成するためのコードを別の「ビルダー」オブジェクトに入れることを考えましたが、実際にはビルダーパターン(テレスコープの排除に関心があると思われる)と一致しないため、「ビルダー」と呼ぶことをためらいます。コンストラクター)。ただし、別の名前(NodeTreeConstructorなど)を呼び出したとしても、ModelDefコンストラクターがノードツリーを構築するのを避けるために、ちょっとしたハックのように感じます。どこかに構築する必要があります。なぜそれを所有しようとしているオブジェクトではないのですか?

8
ループ内にループを持つことはどの時点でタブーですか?
ちょっと興味があるんだけど。Linus Torvaldsからこれを読んだので、私が今までに持っていたほとんどはforループ内のforループでした。 タブは8文字であるため、インデントも8文字です。インデント4(または2!)の文字を深くしようとする異端運動があります。これは、PIの値を3に定義しようとすることに似ています。 理論的根拠:インデントの背後にある全体的な考え方は、制御ブロックの開始位置と終了位置を明確に定義することです。特に、20時間連続して画面を見ていると、大きなインデントがある場合にインデントがどのように機能するかを簡単に確認できます。 現在、一部の人々は、8文字のインデントがあると、コードが右に移動しすぎて、80文字の端末画面で読みにくくなると主張します。 その答えは、3レベル以上のインデントが必要な場合、とにかくねじ込まれてしまい、プログラムを修正する必要があるということです。 https://www.kernel.org/doc/Documentation/CodingStyle 私は、ループの3番目の層に行くことは受け入れられない慣行であり、コードを再構築すると考えました(主にQt)。 Linusは冗談を言っていましたか? 言語やアプリケーションに依存しますか? 3レベル以上のループが絶対に必要なものはありますか?

4
多くのアヒル型動的プログラミング言語が、プロトタイプベースのOOPではなくクラスベースのアプローチを使用するのはなぜですか?
非常に多くの動的プログラミング言語にはダックタイピングの機能があり、クラスやインスタンスのメソッドをいつでも開いて変更できるため(RubyやPythonなど)、... 質問1)動的言語のクラスの必要性は何ですか?プロトタイプ言語ではなくオブジェクトを使用するのではなく、クラスを何らかの「テンプレート」として使用するように言語が設計されているのはなぜですか? また、JavaScriptはプロトタイプベースですが、CoffeeScript(JavaScriptの拡張バージョン)はクラスベースの方法を選択します。また、Lua(プロトタイプベース)とMoonScript(クラスベース)でも同じです。さらに、ES 6にはクラスがあります。 質問2)特にプロトタイプベースの言語を改善しようとする場合、クラスベースに変更する必要があることを示唆していますか?そうでない場合、なぜそのように設計されているのですか?

3
分散データ管理-データベースをマイクロサービスにカプセル化する[終了]
閉じた。この質問はより集中する必要があります。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集するだけで1つの問題に焦点を当てるように質問を更新します。 4年前に閉鎖されました。 私は最近ソフトウェア設計のコースを受講しており、サービスのコンポーネントが可能な限り独立したマイクロサービスサブコンポーネントに分離される「マイクロサービス」モデルの使用について、最近の議論/推奨がありました。 言及された部分の1つは、すべてのマイクロサービスが通信する単一のデータベースを持つという非常によく見られるモデルに従うのではなく、マイクロサービスごとに個別のデータベースを実行することでした。 これについてのより適切な言葉で詳細な説明は、http://martinfowler.com/articles/microservices.htmlの分散型データ管理セクションにあります 。 これを言っている最も顕著な部分: マイクロサービスは、各サービスが独自のデータベース、同じデータベーステクノロジーの異なるインスタンス、または完全に異なるデータベースシステムを管理できるようにすることを好みます-Polyglot Persistenceと呼ばれるアプローチ。モノリスでポリグロット永続化を使用できますが、マイクロサービスではより頻繁に表示されます。 図4 私はこの概念が好きで、他の多くのことの中でも、保守と複数の人が取り組んでいるプロジェクトの強力な改善と考えています。とはいえ、私は決して経験のあるソフトウェアアーキテクトではありません。誰もそれを実装しようとしましたか?どのようなメリットとハードルに遭遇しましたか?

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