タグ付けされた質問 「language-agnostic」

このタグは、プログラミング言語または環境に固有ではない質問用です。

5
データ入力検証-どこ?いくら?[閉まっている]
データ入力の検証は、常に私にとって非常に内部的な闘争でした。 レガシーアプリケーションリライトプロジェクトに実際のセキュリティフレームワークとコードを追加する寸前(これまでのところ、カードキャッスルに強力なレガシーセキュリティコードとデータ検証を保持している)、私はどのくらい検証すべきか、どこなど プロのJava開発者としての5年間で、データ入力の検証とセキュリティ対策のための個人ルールを作成し、改良しました。私は自分の方法を改善したいので、皆さんからいくつかのアイデアを聞きたいと思います。一般的なルールと手順は問題ありませんが、Java固有のものも同様です。 要約すると、これらは私のガイドライン(3層のWebアプリケーションスタイルで公開)であり、簡単な説明があります。 第1層のクライアント側(ブラウザ):最小限の検証、不変のルールのみ(必須の電子メールフィールド、1つのアイテムを選択する必要があるなど)。「6〜20文字」などの追加検証の使用頻度が少なくなります。これにより、変更のメンテナンス作業が増加します(ビジネスコードが安定したら追加できます)。 第1層サーバー側(Web通信処理、「コントローラー」):このルールはありませんが、ここではデータ操作とアセンブリ/解析エラーのみを処理する必要があると考えています(誕生日フィールドは有効な日付ではありません)。ここにさらに検証を追加すると、簡単に本当に退屈なプロセスになります。 第2層(ビジネス層):堅実な検証、それ以下。入力データ形式、範囲、値、メソッドをいつでも呼び出せない場合の内部状態チェック、ユーザーの役割/権限など。できるだけ少ないユーザー入力データを使用し、必要に応じてデータベースから再度取得します。取得したデータベースデータも入力と見なす場合、特定のデータが信頼できないか、DBで十分に破損していることがわかっている場合にのみ検証します。 第3層(データ層/ DAL / DAO):データにアクセスするのはビジネス層のみであるため、ここでは多くの検証が必要とは考えられません(「param1がtrueの場合、param2はnullであってはならない」などの場合に検証します)。ただし、「ここ」を意味する場合、「データベースにアクセスするコード」または「SQL実行メソッド」を意味することに注意してください。データベース自体はまったく逆です。 データベース(データモデル):適切なプライマリキー、外部キー、制約、データ型/長さ/サイズを使用して、DB上の不正なデータや破損データを可能な限り回避するために、十分に考慮し、強力かつ自己強化する必要があります/ precisionなど-独自のプライベートディスカッションがあるため、このトリガーは除外します。 初期のデータ検証は優れており、パフォーマンス面でも優れていることは知っていますが、繰り返しデータ検証を行うのは退屈なプロセスであり、データ検証自体は非常に面倒です。これが、非常に多くのコーダーがそれをスキップするか、途中でやる理由です。また、常に同期されていない場合、重複する検証はすべてバグの可能性があります。これらは、時間、帯域幅、CPU、ケースバイケースで処理される例外を犠牲にして、ほとんどの検証をビジネス層まで許可することを好む主な理由です。 それで、あなたはこれについてどう思いますか?反対意見ですか?他の手順はありますか?そのようなトピックへの参照?寄付はすべて有効です。 注:物事のJavaの方法を考えている場合、私たちのアプリはSpring MVCとMyBatisを使用したSpringベースです(パフォーマンスと不良データベースモデルはORMソリューションを除外します)。Spring SecurityをセキュリティプロバイダーとJSR 303(Hibernate Validator?)として追加する予定です。 ありがとう! 編集:第3層に関する追加の明確化。

11
メンテナンスに関しては、「その他」はブレースを介在させずに安全と見なされますか?
であるelse while「安全」メンテナンスが賢明と考え括弧を介在せずに? if-else以下のような中括弧なしでコードを書く... if (blah) foo(); else bar(); ...中括弧がないため、コードの意味を不注意に変更することが非常に簡単になるため、リスクが伴います。 ただし、以下も危険ですか? if (blah) { ... } else while (!bloop()) { bar(); } またはelse while、介入する中括弧なしで「安全」と見なされますか?

9
データの移行-危険または不可欠ですか?
私の会社のソフトウェア開発部門は、特にマネージャーにとって、データ移行が潜在的に危険であると見なされているという問題に直面しています。 その背景は、お客様が質の悪い大量のデータを使用していることです。これだけされた理由について、部分的に当社のソフトウェアに関連したそれらのほとんどがされています:品質ではなく、データの履歴に前身のシステムから移行したいくつかのバグが発生し、(主に業務)の不整合データレコードまたは中misentries上の事故により、お客様側(当社のソフトウェアがエラーにより許可したもの)。 私のマネージャーからの最も重要な反論は、障害のあるデータがさらに悪いデータに変わる可能性があることです。データのトラブルは顧客のマネージャーを覚醒させ、顧客側のプロセスはシステムに多少適合しているため、もはや機能しない可能性があります 個人的には、データの移行はソフトウェア開発の不可欠な部分であり、データの移行はデータのリファクタリングとはコードで見ることができると考えています。データの移行は、進化するソフトウェアを作成するために不可欠だと思います。それがなければ、悪いデータ構造をある程度回避する痛みを伴うソフトウェアを作成する必要があります。 あなたに聞いています: 開発者の視点からだけでなく、特に実際のケースでは、データ移行についてどう思いますか? 私のマネージャーの意見に反論はありますか? あなたの会社は、データの移行とそれに起因する問題にどのように対処していますか? このトピックに属する他の興味深い考えはありますか?

2
純粋な言語のガベージコレクションはどの程度違いますか?
Haskellのような純粋な言語では、すべてのデータは不変であり、既存のデータ構造は一切変更できません。さらに、不変データおよび関数型プログラミングパターンに関する多くのアルゴリズムは、本質的に大量のガベージをmap生成します(たとえば、中間リストの作成のチェーン)。 ガベージコレクターは、他の方法ではできない純度に直面して、どのような戦略と手法を採用していますか?純粋なコンテキストではない不純な言語のGCでうまく機能するものは何ですか?純粋な言語はGCに対して他にどのような新しい問題を引き起こしますか?


7
1つのことだけを行うクラスのパターン
のは、私が手続き持っていると言うものを行うに: void doStuff(initalParams) { ... } 今、私は「何かをする」ことは非常に複雑な操作であることを発見しました。手順は大きくなり、複数の小さな手順に分割し、すぐに何かを行うときに何らかの状態を持つことが有用であることに気付きました。したがって、私はそれを独自のクラスに分解します: class StuffDoer { private someInternalState; public Start(initalParams) { ... } // some private helper procedures here ... } そして、私はこれを次のように呼び出します: new StuffDoer().Start(initialParams); またはこのように: new StuffDoer(initialParams).Start(); そして、これが間違っていると感じるものです。.NETまたはJava APIを使用するとき、私は常にを決して呼び出さないためnew SomeApiClass().Start(...);、間違っていると思われます。確かに、StuffDoerのコンストラクターをプライベートにし、静的ヘルパーメソッドを追加できます。 public static DoStuff(initalParams) { new StuffDoer().Start(initialParams); } しかし、その場合、外部インターフェイスが1つの静的メソッドのみで構成されるクラスがあり、これも奇妙に感じます。 したがって、私の質問:このタイプのクラスには定評のあるパターンがありますか? エントリポイントが1つしかない 「外部的に認識可能な」状態がありません。つまり、インスタンス状態はその1つのエントリポイントの実行中にのみ必要です。

6
クトゥルフの方法の解析に対する議論は何ですか?
会社にとって非常に重要になる可能性のあるツールのために、ドメイン固有言語を実装するタスクを割り当てられました。この言語は単純ですが、些細なことではなく、ネストされたループ、文字列の連結などを既に許可しており、プロジェクトが進むにつれて他の構成要素が追加されることは実質的に確実です。 レクサー/パーサーを手書きで書くことは(文法が簡単でない限り)時間がかかり、エラーが発生しやすいプロセスであることを経験から知っています。そのため、yaccのパーサージェネレーターまたはParsecのような組み合わせライブラリーという2つのオプションがありました。前者も同様に優れていましたが、さまざまな理由で後者を選び、関数型言語でソリューションを実装しました。 結果は私の目にはかなり壮観で、コードは非常に簡潔で、エレガントで読みやすく/流fluentです。java / c#以外でプログラミングしたことがない場合、少し奇妙に見えるかもしれないと思いますが、java / c#で書かれていないものには当てはまります。 しかし、ある時点で、文字通り同僚に攻撃されました。私の画面を一目見た後、彼はコードが理解不能であり、解析を再発明するのではなく、誰もがするようにスタックとString.Splitを使用するだけだと宣言しました。彼は多くの騒ぎをしました、そして、私は彼を納得させることができませんでした、私が彼を信じることができませんでした 私は彼に言語を説明することさえ申し出ましたが、役に立ちませんでした。 私は議論が経営陣の前で再浮上することを確信しているので、いくつかの確固たる議論を準備しています。 これらは、String.Splitベースのソリューションを回避するために頭に浮かんだ最初のいくつかの理由です。 特殊なケースや物事を迅速に制御不能にするには、多くのifが必要です 多数のハードコードされた配列インデックスにより、メンテナンスが困難になります メソッドの引数として関数呼び出しのようなものを処理することは非常に困難です(例:add((add a、b)、c) 構文エラーの場合に意味のあるエラーメッセージを提供することは非常に困難です(発生する可能性が非常に高い) 私はすべて単純さ、明快さ、そして不必要なスマート暗号のようなものを避けるためにいますが、バーガーフリッパーでも理解できるようにコードベースのすべての部分を馬鹿にすることは間違いだと思います。インターフェースを使用しない、懸念事項の分離を採用しない、コードをコピーアンドペーストするなど、私が聞いたのと同じ議論です。結局、ソフトウェアプロジェクトに取り組むには、最低限の技術的能力と学習意欲が必要です。(この議論はおそらく不快に聞こえるかもしれませんが、戦争を開始しても誰も助けにはなりません) クトゥルフの方法を解析することに対するあなたの好きな議論は何ですか?* *もちろん、彼が正しいと私を納得させることができれば、私も完全に幸せになります

5
Java instanceof演算子はリフレクションと見なされますか?
Java演算子を使用することinstanceofは一種の反省かどうか、今日同僚と話し合いました。そして、議論はすぐに実際に反射を定義するものに進化しました。 だから、反射の定義は何ですか? そして、instanceof考慮された「反射を使用する」の使用法はありますか? さらに、instanceof反射と見なされる場合、多型も「反射を使用する」わけではありませんか?そうでない場合、違いは何ですか?

3
「必要に応じてXを実行」メソッドの命名
Xを実行する必要があるかどうかをチェックし、必要に応じてXを実行するメソッドに名前を付ける良い方法は何ですか? たとえば、新しいユーザーがログインした場合にユーザーリストを更新するメソッドに名前を付ける方法は?UpdateListIfNeeded長すぎるように見えますが、単純なUpdateListことは、毎回高価で不必要な操作が行われることを意味します。EnsureListUpdatedバリアントでもあります。 C#には、Xが可能かどうかを確認して実行するbool TryXXX(args, out result)パターン(たとえばint.TryParse(str, out num))がありますが、それは微妙に異なります。

4
このようなコードは「列車事故」(デメテルの法則に違反)ですか?
私が書いたいくつかのコードを見てみると、次の構成要素に出会い、考えさせられました。一見、十分きれいに見えます。はい、実際のコードでは、getLocation()メソッドには、取得する場所を正確に説明する、より具体的な名前があります。 service.setLocation(this.configuration.getLocation().toString()); この場合、serviceは、メソッド内で宣言された既知の型のインスタンス変数です。this.configurationクラスコンストラクターに渡されたものであり、特定のインターフェイス(パブリックgetLocation()メソッドを必須とする)を実装するクラスのインスタンスです。したがって、式の戻り値の型this.configuration.getLocation()は既知です。特にこの場合には、それがあるjava.net.URLのに対し、service.setLocation()望んでいますString。2種類の文字列とURLが直接の互換性はありませんので、いくつかの変換の並べ替えは、丸い穴に四角いペグに合わせて必要とされます。 しかし、中に引用されたようにデメテルの法則によればクリーンコード、メソッドFクラスでCが唯一のメソッドを呼び出す必要がCによって作成または引数として渡されるオブジェクトF、およびインスタンス変数に保持されているオブジェクトC。それを超えるもの(toString()メソッド呼び出し自体の結果として作成された一時オブジェクトを考慮する場合を除き、上記の特定のケースでは最後です。この場合、法律全体が議論の余地がないようです)。 上記の制約が与えられた場合、上記のような呼び出しが推奨されない、または拒否されるべきである正当な理由はありますか?それとも、私は過度に細心の注意を払っていますか? パラメーターとして渡されたオブジェクト(などによって返されるオブジェクト)URLToString()を単に呼び出し、結果を返すメソッドを実装する場合、まったく同じ結果を得るために呼び出しをラップすることができます。効果的には、変換を1ステップ外に移動するだけです。それはどういうわけかそれを受け入れられるでしょうか?(思わないそのすべてが少し動き回る事があるので、それは、任意の違いのいずれかの方法を作るべきではないことを、直感的に、私には。しかし、デメテルの法則の手紙で行く引用として、それはI以来、許容可能ですその後、関数のパラメーターを直接操作します。)toString()URLgetLocation()getLocation() これがtoString()標準型を呼び出すよりも少しエキゾチックなものである場合、違いが生じるでしょうか? 答えるときserviceは、変数が属する型の動作またはAPIを変更することは実用的ではないことに注意してください。また、議論のために、戻り値の型を変更することgetLocation()も非現実的であるとしましょう。

3
FizzBu​​zzの質問の有効性に関する正式な研究はありますか?[閉まっている]
閉まっている。この質問はトピック外です。現在、回答を受け付けていません。 この質問を改善したいですか? 質問を更新して、 Software Engineering Stack Exchangeのトピックになるようにします。 4年前に閉鎖されました。 見た後にこの質問を任意のがあります:FizzBu​​zz面接の質問の変化に、今日だけでなく、周りにそれに関連する他の質問を見て、私が聞いている正式な、これはインタビューの手法としてどのように効果的な研究は?候補のかなりおかしな割合(場合によっては95%以上)を除外すると言う人はたくさんいますが、優れたプログラマー/開発者を見つけるのにどれほど良いでしょうか? 職務にふさわしい候補者を選択するには、ソフトスキルがハードスキルよりも優れた指標になる可能性があることを示すいくつかの研究があります。同様に、非常に多くの候補者がこのテストに失敗する中間的な理由があるかもしれません(神経質、「トリックだ」と考えるなど)。 これまでのコメントに基づいて、FizzBu​​zzの質問の背後にある考え方は、その人がさらに考慮すべき優れた(十分な)コーディングスキルを持っているかどうかを判断することです。私はFizzBu​​zzが実際にこれを行うと完全に確信しているわけではありません。また、FizzBu​​zz は採用プロセスの非常に早い段階で非常に大きな割合の候補者をフィルタリングすることを忘れないでください。 また、FizzBu​​zzの有効性を見ることは、定量的に完全に行えることを指摘します。これは、非常に可変的で非常に非科学的である(ただし、新規採用の決定には依然として非常に重要である)「適合」または「情熱」を見ることとは異なります。

14
マネージャーがプログラミング言語を選択する方法
この質問は、Software Engineering Stack Exchangeで回答できるため、Stack Overflowから移行されました。 8年前に移行され ました。 マネージャーがプロジェクトで使用されるプログラミング言語を課すことができ、しばしば課すことになるのは誰にとっても秘密ではありません。 私自身プログラマーであるため、これを理解することはできませんでした。 しかし、今私はそう思います。JoelSpolskyがポッドキャストでQuickBooksを使うべきだと言ったとき、「世界のすべての会計士はそれを知っている」ので啓示を受けたばかりです。これは、「世界中のすべてのプログラマーがJavaを知っているためJavaを選択する」と非常によく似ていると思いました。 同じ問題を別の観点から見たので、会計についてはあまり知りませんが、プログラミングについては知っていますが、プロジェクトに適切なプログラミング言語が選択されていることをプログラマがどのように支援できるか疑問に思っています?

6
コンパイラが「複雑な」式を静的に型チェックするときに使用される一般的な手順は何ですか?
注:タイトルで「複雑」を使用したとき、式には多くの演算子とオペランドがあることを意味します。式自体が複雑なわけではありません。 私は最近、x86-64アセンブリの単純なコンパイラに取り組んでいます。コンパイラのメインフロントエンド(レクサーとパーサー)を終了し、プログラムの抽象構文ツリー表現を生成できるようになりました。そして、私の言語は静的に型付けされるので、次のフェーズ、つまりソースコードの型チェックを実行しています。しかし、私は問題に遭遇し、自分で合理的に解決することができませんでした。 次の例を考えてみましょう。 私のコンパイラのパーサーは、次のコード行を読み取りました。 int a = 1 + 2 - 3 * 4 - 5 そして、それを次のASTに変換しました: = / \ a(int) \ - / \ - 5 / \ + * / \ / \ 1 2 3 4 次に、ASTを入力する必要があります。最初に=演算子をチェックするタイプから始まります。まず、オペレーターの左側をチェックします。変数aが整数として宣言されていることがわかります。そのため、右側の式が整数に評価されることを確認する必要があります。 式が1or などの単一の値である場合、これがどのように行われるかを理解しています'a'。しかし、複数の値とオペランドを持つ式 -上記のような複雑な式 -では、これはどのように行われますか?式の値を正しく判断するには、型チェッカーが実際に式自体を実行し、結果を記録する必要があるようです。しかし、これは明らかにコンパイル段階と実行段階を分離する目的を無効にしているようです。 私がこれを行うことができると思う他の唯一の方法は、ASTの各部分式のリーフを再帰的にチェックし、リーフのすべてのタイプが期待される演算子タイプと一致することを確認することです。そのため、=演算子から始めて、型チェッカーは左側のすべてのASTをスキャンし、リーフがすべて整数であることを確認します。次に、部分式の各演算子に対してこれを繰り返します。 「The Dragon Book」のコピーでトピックを調査しようとしましたが、あまり詳細に説明されていないようで、すでに知っていることを繰り返します。 コンパイラが多くの演算子とオペランドを含む式を型チェックするときに使用される通常の方法は何ですか?上記の方法のいずれかが使用されていますか?そうでない場合、メソッドは何であり、どのように正確に機能しますか?

9
コードを読むことはできるが、主にそれを書くのに苦労している[終了]
閉まっている。この質問はトピック外です。現在、回答を受け付けていません。 この質問を改善したいですか? 質問を更新して、 Software Engineering Stack Exchangeのトピックになるようにします。 5年前に閉鎖されました。 私は最近、初めてのプログラミング試験を受けました...そして、私はかなり失敗しました。まったくうまくいきませんでした。大学時代以外のことを責めるのは自分だけです。ほとんど何もしませんでした。 今、私は夏の時間の近くに別の予定を立てていますが、これが二度と起こらないようにしています。ここ数週間、私は本を読んで、読んで、もう少し読んでいます。私は見逃した古いことと、私たちがしている新しいことを続けています。ですから、明らかに、言語の理解に大きな違いがあることに気付くことができます。しかし、それはそれについてです。私はコードを読むことができ、コードで何が起こっているのかがわかりました...しかし、自分でコードを書くということになると、私は無知です。どのアプローチを取るべきかわからないので、質問を完全に理解することはできません。 私は毎日かなりの量の読書をしてきました(過去1か月かそこらで5〜6時間くらいしていました)。特に、ノード、リスト、アレイリスト、インターフェースなどの知識を持っているが、それについてのページでそれらを読む以外に。プログラムで起こっていることすべてを正確に指摘することができますので、プリサンプルコードに注釈を付けます。しかし、自分のコードを書くことは別の話です。

6
プログラミング言語が他の言語にコンパイルされると言うにはどうすればよいですか?
プログラミング言語を他のプログラミング言語にコンパイルできることを英語で言うにはどうすればよいですか? 例はHaxeです。Webサイトでは、言語は「マルチプラットフォーム」と記述されています。 マルチプラットフォーム:Haxeは、JavaScript、Flash、NekoVM、PHP、C ++、C#、Java(すぐに)の高速コンパイラーを使用して、すべての一般的なプログラミングプラットフォームにコンパイルできます。 しかし、マルチプラットフォームはハードウェアまたはソフトウェアプラットフォーム(win、mac、linux)と誤解される可能性があります。 それでは、この能力を表す最も適切な言葉は何ですか?

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