ソフトウェア工学

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


2
ループ(while / for)を再帰に、または再帰からループに変換する一般的な方法は?
この問題は主にアルゴリズムに焦点を当てており、おそらく抽象的でより学術的なものです。 例は思考を提供しているので、一般的な方法を使用したいので、例はあなたの思考についてより明確にするためにのみ使用されます。 一般的に、ループは再帰に変換できます。 例えば: for(int i=1;i<=100;++i){sum+=i;} そして、それに関連する再帰は次のとおりです。 int GetTotal(int number) { if (number==1) return 1; //The end number return number+GetTotal(number-1); //The inner recursive } そして最後にこれを簡素化するには、末尾再帰が必要です: int GetTotal (int number, int sum) { if(number==1) return sum; return GetTotal(number-1,sum+number); } ただし、ほとんどの場合、回答と分析はそれほど簡単ではありません。私が知りたいのは: 1)ループ(for / while……)を再帰に変換する「一般的な一般的な方法」を取得できますか?そして、変換を行う際にどのようなことに注意する必要がありますか?変換プロセスと同様に、いくつかのサンプルとあなたのpersudo理論で詳細な情報を書くほうが良いでしょう。 2)「再帰」には、線形再帰と末尾再帰の2つの形式があります。それで、どちらを変換するのが良いですか?どの「ルール」をマスターすべきですか? 3)再帰の「履歴」を保持する必要がある場合がありますが、これはループステートメントで簡単に実行できます。 例えば: List<string> history = new List<string>(); …

5
gitに移行するときに大きなsvn履歴についてどうすればよいですか?
編集は、次のようないくつかの類似した質問とは異なり、GitリポジトリへのマルチGBのSVNリポジトリの移動 や /programming/540535/managing-large-binary-files-with-gitを 私のシナリオでは、といういくつかのサブプロジェクトを含みません簡単にgitサブモジュールに変換することも、git-annexに適した非常に大きなバイナリファイルに変換することもできます。バイナリが、グラフィックなどのコンパイル時のアセットであるかのように、同じリビジョンのメインソースコードに密結合したテストスイートである単一のリポジトリです。 私は、svnから古い中/大サイズ(50ユーザー、60kリビジョン、80Gb履歴、2Gb作業コピー)のコードリポジトリの切り替えを調査しています。ユーザーの数が増えると、トランクに大量のチャーンが発生し、多くの場合、機能が複数のコミットに分散し、コードのレビューが困難になります。また、分岐せずに不良コードを「ゲート」する方法はありません。レビューはトランクにコミットされた後にのみ実行できます。私は代替案を調査しています。gitに移行できることを望んでいましたが、いくつか問題があります。 gitに関する限り、現在のリポジトリの問題はサイズです。そこには多くの古いクラフがあり、gitに変換するときに--filter-branchでクリーニングすると、サイズが1桁、つまり5〜10 GBに削減されます。これはまだ大きすぎます。リポジトリサイズが大きい最大の理由は、テストへの入力であるバイナリドキュメントが多数あることです。これらのファイルは.5mbと30mbの間で異なり、数百があります。また、非常に多くの変更があります。私はサブモジュールやgit-annexなどを見てきましたが、完全な履歴が必要な多くのファイルの別館があるのと同様に、サブモジュールでのテストが間違っていると感じています。 したがって、gitの分散された性質は、実際にGitを採用することを妨げるものです。分散についてはあまり気にしません。安価な分岐機能と強力なマージ機能が欲しいだけです。私がgitユーザーの99.9%がそうするように、私たちは祝福された裸の中央リポジトリを使用します。 gitを使用するときに各ユーザーが完全なローカル履歴を保持する必要がある理由を理解できませんか?ワークフローが分散化されていない場合、そのデータはユーザーのディスク上で何をしているのでしょうか?gitの最近のバージョンでは、最近の履歴のみを持つ浅いクローンを使用できることを知っています。私の質問は、これをチーム全体の標準操作モードとして実行することは可能ですか?gitを常に浅く設定して、完全な履歴のみを中央に持つことができますが、デフォルトではユーザーは履歴の1000回転しか持つことができませんか?もちろん、そのオプションは1000回転をgitに変換し、考古学のためにsvnリポジトリを保持することです。ただし、このシナリオでは、テストドキュメントの次の数千の改訂後に同じ問題が再び発生します。 あなたがいることを多くのバイナリファイルを含む大規模なレポでのgitを使用するための優れたベストプラクティスは何であるかの履歴をしたいの?ほとんどのベストプラクティスとチュートリアルは、このケースを回避するようです。少数の巨大なバイナリの問題を解決するか、バイナリを完全に削除することを提案します。 浅いクローニングは通常の操作モードとして使用できますか、それとも「ハック」ですか? メインソースリビジョンとサブモジュールリビジョンの間に強い依存関係があるコードにサブモジュールを使用できますか(コンパイル時のバイナリ依存関係、ユニットテストスイートなど)。 gitリポジトリ(オンプレミス)の「大きすぎる」とはどのくらいですか?4GBまで下げることができたら、切り替えを避けるべきですか?2GB?
23 git  svn 

2
命名規則:最終フィールド(静的ではない)
今日はfinal、Javaクラスのフィールドの命名について同僚と話し合いました。 彼の意見finalでは、フィールドはインスタンスの作成後に値が変化しないため、定数と見なされる必要があります。 これにより、finalフィールドに次の命名規則が適用されます。 public class Foo { private static final String BLA_BLA = "bla"; private final String BAR_BATZ; ... } 私の意見では、static finalフィールドのみが定数と見なされるべきですが、フィールドfinalは通常のcamelCase命名規則に従うべきです。 public class Foo { private static final String BLA = "bla"; private final String barBatz; ... } 彼は私よりもはるかに経験豊富なプログラマーであり、私は彼の意見に同意し、彼を非常に優れた開発者と見なしているため、今は少し不確かです。 これに関する入力はありますか?
23 java  naming  final 

2
既存のアイテムをREST APIのコレクションに追加するための最適なパターンは何ですか?
私は実用的なREST APIを設計していますが、既存のエンティティをコレクションに追加する最善の方法に少し立ち往生しています。私のドメインモデルには、サイトのコレクションを持つプロジェクトが含まれています。これは厳密な多対多の関係であり、関係を明示的にモデル化するエンティティ(ProjectSiteなど)を作成する必要はありません。 私のAPIにより、消費者は既存のサイトをプロジェクトに追加できます。ハングアップしているのは、本当に必要なデータはProjectIdとSiteIdだけだということです。私の最初のアイデアは: 1. POST myapi/projects/{projectId}/sites/{siteId} しかし、私も考えました 2. POST myapi/projects/{projectId}/sites JSONコンテンツとして送信されるSiteエンティティを使用します。 オプション1はシンプルで機能しますが、あまり適切ではないため、このパターンに従うことができない他の関係があるため、APIに矛盾が生じます。 オプション2は良い感じですが、2つの懸念につながります。 新しいサイトが投稿された場​​合(SiteId = 0)、サイトを作成するか、例外をスローする必要がありますか? 関係を作成するためにProjectIdとSiteIdのみが必要なため、他のプロパティのデータが間違っているか、欠落しているサイトが投稿される可能性があります。 3番目のオプションは、関係を作成および削除するためだけに単純なエンドポイントを提供することです。このエンドポイントでは、ProjectIdとSiteIdのみを含むJSONペイロードが必要です。 どう思いますか?
23 rest  api-design 

5
別の一般的な言語は、Java / Java EEと同様の複雑さを管理しながら、ファクトリパターンを使用する必要をどのように回避しますか?
ファクトリー・パターン(または少なくともの使用FactoryFactory..)は、次のような多くのジョークのお尻です。 RequestProcessorFactoryFactory.RequestProcessorFactoryのような詳細で「創造的な」名前の他に、Java / C ++でプログラミングする必要があり、Abstract_factory_patternのユースケースがある場合、ファクトリパターンに根本的な問題はありますか? 他の一般的な言語(RubyやScalaなど)を使用して、同様の複雑さを管理する必要はありませんか? 私が尋ねる理由は、Java / Java EEエコシステムのコンテキストで言及されている工場の批判がほとんど見られますが、他の言語/フレームワークがそれらをどのように解決するかについては説明しません。

7
CおよびC ++で符号なし整数を使用する
長い間私を困惑させる非常に簡単な質問があります。私はネットワークとデータベースを扱っているので、扱うデータの多くは32ビットと64ビットのカウンター(符号なし)、32ビットと64ビットの識別IDです(また、符号の意味のあるマッピングはありません)。私は、負の数として表現される可能性のある実際の単語の問題を実際に扱うことは決してありません。 私と私の同僚は、これらの問題のためにuint32_t、通常、符号なしの型uint64_tを使用します。頻繁に発生するため、配列インデックスや他の一般的な整数の使用にも使用します。 同時に、私が読んでいるさまざまなコーディングガイド(Googleなど)は、符号なし整数型の使用を推奨しておらず、JavaとScalaのどちらにも符号なし整数型がないことを知っています。 ですから、私たちの環境で署名された値を使用するのは非常に不便であると同時に、コーディングガイドがまさにこれを行うことを主張する正しいことを理解できませんでした。
23 c  coding-style 

3
コピー命令の名前が通常MOVであるのはなぜですか?
非常に多くのアセンブラーでは、値のコピー命令には通常「MOV」という名前が付けられ、マニュアルの説明には通常「move」も含まれています(ただし、「load」、「store」、「extract」など、他の単語も使用できます) )この規則に従わないISAを見つけることはまれです。 一方、他のコンテキストでは、ソースが破棄されるという意味で「move」と「copy」は異なります(たとえば、Unixでは「mv」と「cp」、Norton CommanderとクローンではMove [F6] など)。 )アセンブラーの「移動」には、セマンティック「コピー」があり、ソース値をそのまま保持します。 これは少なくともIBM 1401(1959)以来始まっていることがわかりましたが、IBM 360はこの単語をストレージ内コピーにのみ使用し、レジスタとストレージ(「ロード」と「ストア」を使用)間の操作には使用しませんでした。しかし、なぜそれがまだ広く使用されており、「コピー」または「ストア」に置き換えられていないのですか?
23 history  assembly 

5
バージョン番号はいつ増やすべきですか?
私は学校でプログラミングを学ばなかったし、(プロの)開発者として働いていないので、基本的なことの多くははっきりしていません。この質問では、そのうちの1つを明確にしようとします。 今度は、私は問題を抱えていると仮定しましょう#1、#2そして#3バージョンの強化/修正されるように設定されている私の問題トラッカーで1.0.0、最後の(安定)バージョンであること0.9.0。 いつバージョンを増やすべき1.0.0ですか?a)上記の問題の1つのみがクローズされた場合、またはb)バージョンに関連するすべての問題1.0がクローズされた場合 それを行う正しい方法はどれですか?そして、正しい方法で、私は業界で現在使用されているものを意味します。

5
純粋に機能的な言語はモジュール性をどのように処理しますか?
私は、オブジェクト指向のバックグラウンドから来ました。そこでは、クラスを使用して、少なくともオブジェクトを作成するために使用するか、継承で使用できるコードの簡単なリサイクルを可能にする抽象化層を作成することができます。 たとえば、動物のクラスを持つことができ、そこから猫と犬を継承し、すべてが同じ特性を多く継承し、それらのサブクラスから動物の品種または名前を指定できるオブジェクトを作成できますそれの。 または、クラスを使用して、わずかに異なるものを処理または含む同じコードの複数のインスタンスを指定できます。検索ツリーまたは複数の異なるデータベース接続のノードとそうでないもの。 私は最近関数型プログラミングに移行しているので、私は疑問に思い始めて いました。つまり、クラスとオブジェクトの概念のない言語です。

5
再フォーマットとバージョン管理
コードのフォーマットが重要です。インデントさえ重要です。そして、小さな改善よりも一貫性が重要です。ただし、プロジェクトには通常、1日目から明確で完全で検証可能で強制的なスタイルガイドがなく、大きな改善がいつでも届きます。たぶんあなたはそれを見つける SELECT id, name, address FROM persons JOIN addresses ON persons.id = addresses.person_id; /として書かれた方が良い SELECT persons.id, persons.name, addresses.address FROM persons JOIN addresses ON persons.id = addresses.person_id; クエリに列を追加する作業中。これは、コード内の4つのクエリすべての中で最も複雑なものか、数千ものクエリの中でささいなクエリかもしれません。移行がどれほど困難であっても、価値があると判断します。しかし、主要なフォーマットの変更全体でコードの変更をどのように追跡しますか?あきらめて「これが私たちが再び開始するポイントです」と言うか、リポジトリ履歴全体のすべてのクエリを再フォーマットすることができます。 Gitのような分散バージョン管理システムを使用している場合は、最初のコミットに戻り、そこから現在の状態に変更できます。しかし、それは多くの作業であり、作業中は他のすべての人が作業を一時停止する必要があります(または、すべてのマージの母親に備える必要があります)。すべての結果の中で最高のものを提供する履歴を変更するより良い方法はありますか? すべてのコミットで同じスタイル 最小限のマージ作業 ? 明確にするために、これはプロジェクト開始時のベストプラクティスに関するものではなく、大規模なリファクタリングがGood Thing™と見なされたが、追跡可能な履歴が必要な場合に何をすべきかを示しています。バージョンが常に同じように動作することを保証する唯一の方法である場合、履歴を書き換えることは素晴らしいことではありませんが、クリーンな書き換えの開発者の利点はどうですか?特に、書き換えたバージョンが元のバージョンとまったく同じように機能することを保証する方法(テスト、構文定義、またはコンパイル後の同一のバイナリ)がある場合はどうでしょうか?

9
クライアントの関与なしにアジャイルを達成できますか?
アジャイルに関する本を書くことができませんでした。私は彼らのプロセスをアジャイルと呼ぶいくつかの店で働いてきました。アジャイル開発の主なポイントの1つは、定期的なクライアントの関与です。スプリントの後、フィードバックを得るためにクライアントに作業をデモすることができます。すすぎ、繰り返します。 私が出くわす問題は、多くのクライアントがそのようになりたくないということです。彼らは、ウォーターフォールアプローチを好むでしょう。要件を事前に収集し、完了したら戻ってください。私の経験では、滝は機能しません。クライアントは、それを見るまで何が欲しいかを知りません。ウォーターフォールのジレンマは、すべての要件を事前に取得したい開発者の大規模なコミュニティによってさらに広まります。このようにして、彼らは自分が何を構築しているのかを知り、それに応じて設計することができます。そして、クライアントは、前述の要件に「サインオフ」したので責任があります。 私は間違っていますか?クライアントの関与なしにアジャイルは機能しますか?もしそうなら、私が議論した問題をどのように、どのように克服しますか?
23 agile  waterfall 

2
ドメイン駆動設計-エンティティ問題の外部依存関係
Domain-Driven-Designを開始したいのですが、開始する前に解決したい問題がいくつかあります:) グループとユーザーがあり、ユーザーがグループに参加したい場合、groupsService.AddUserToGroup(group, user)メソッドを呼び出していると想像してください。DDDで行う必要がgroup.JoinUser(user)あります。 ユーザーを追加するための検証ルールがある場合、またはユーザーがグループに追加されたときに外部タスクを開始する必要がある場合に問題が発生します。これらのタスクを実行すると、エンティティが外部依存関係を持つことになります。 例としては、ユーザーが最大3グループまでしか参加できないという制限があります。これを検証するには、group.JoinUserメソッド内からのDB呼び出しが必要です。 しかし、エンティティがいくつかの外部サービス/クラスに依存しているという事実は、私にはそれほど自然で「自然」ではないようです。 DDDでこれに対処する適切な方法は何ですか?


1
大きなプロジェクトを分割してマルチモジュールMavenプロジェクトを作成する
私は依存関係管理にMavenを使用しているSpring-MVCアプリケーションに取り組んでいます。プロジェクトが大きいので、プロジェクトをいくつかの部分に分割することを考えています。いくつか疑問がありましたが、ここで答えが得られることを願っています。 現在、ROOT.warサーバー上のApache Tomcatのように単一のWARファイルをデプロイしています。プロジェクトが大きいので、通知とメール、サードパーティサービス、PUSH(Cometd)、REST APIなどのようなwebappの部分があります。現在、それらはすべてクラブであり、互いに依存しています。たとえば、通知はユーザーに合わせて調整されるため、Notificationオブジェクトもオブジェクトに依存しPersonます。 大きなプロジェクトを分割する主な目的は、バグ修正、機能の追加、テストなどのために個々のモジュールで作業できるようにすることです。そして、満足したら、このモジュールのみをアプリケーション全体ではなくサーバー上で置き換えることができます。これは可能ですか? 前述したように、オブジェクト間に依存関係とマッピングがあります。これらは異なるサブモジュール間でどのように管理されますか、またはインポートステートメントだけが他のプロジェクトを含むように変更されますか? 私が言ったように、意図は個々のモジュールに取り組み、それらを展開できるようにすることです(できればホット)。現在、として単一のWARファイルのみがありますROOT.war。分割により複数のwarファイルが作成され、URLで参照されますdomain-name.com/module_name/some_mappingか? 現在ドキュメントを確認していますが、これはMavenが提供するマルチモジュールで達成したい主な目的であり、これが実現可能かどうかを知りたいと思っています。さらに情報が必要な場合は、お知らせください。 現在、私は次のように春から親POMを使用しています: <parent> <groupId>io.spring.platform</groupId> <artifactId>platform-bom</artifactId> <version>1.1.3.RELEASE</version> <relativePath /> </parent>

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