現状: 冗長
Web 開発では、同じ機能を実装するために異なるプログラミング言語を使用することがよくありますか?
たとえば、ファイルのアップロード機能では、アップロードされるファイルのファイル形式の制限が必要です。通常、制限にはサフィックス名を使用します。
フロントエンド
ユーザーエクスペリエンスのために、ユーザーが選択したファイルはページ上で判断され、合法である場合にのみユーザーはファイルをアップロードできます。
function is_filetype(filename,types) {
types = types.split(',');
var pattern = '.(';
for(var i=0; iif(0 ! = i) {
パターン = '|';
}
パターン = type[i].trim();
パターン = ')$'; RegExp(pattern , 'i').test(filename);
// ここで N 行のコードを省略します
if(!is_filetype($('#uploadfile') (), 'doc,pdf,txt,wps,odf,md,png,gif,jpg')){
can_submit = false; // アップロードは許可されません
$('#uploadfile').val ('') ;
alert('アップロードのみが許可されます: ' constant.RESUME_FILETYPES);
}
// ここでは N 行のコードが省略されています
バックエンド
悪意のあるアップロードの懸念から、ユーザーがアップロードしたファイルの再審査は避けられません。そこで、Python を使用してファイルのサフィックスを決定するロジックを作成しました
def is_filetype(filename,types):
types = types.split(',')
pattern = '.(' '|'.join([ t.strip( ) for t in type]) ')$';
return re.search(pattern, filename, re.I) != なし
# Web リクエスト ハンドラー
# 省略N 行コード
このように作業が重複する理由は何ですか?
1. フロントエンドは決して信頼できません。
2. フロントエンドとバックエンドは異なるプログラミング言語を使用します。
そのような冗長性のコストはどれくらいですか?
1. ビジネス ロジックを変更し、それを 2 回繰り返す必要があります。docx ファイル タイプがサポートされていないことが突然判明した場合は、JavaScript コードと Python コードを同時に変更する必要があります。
2. JavaScript コードと Python コードのビジネス ロジックの一貫性を確保するコスト。 2 種類のテストを別々に記述する必要があり、単体テストの実行時間は 2 倍になります。
nodejs 時代: DRY
nodejs
はもう使用しない
DRY !1 つのコード、フロントエンドとバックエンドを同時に実行
(function(exports){
exports.RESUME_FILETYPES = 'doc,docx, pdf,txt,wps,odf,md,png,gif,jpg';
})((function(){
if(typeof exports ===) '未定義') {
window.constant = {};
return window.constant; else {
return エクスポート; >
// util.js
(function(exports){
/**
* 文字列の両端の空白文字を削除します
*
* @return {String}
* @api public
*/
String.prototype.trim = function(){
return this .replace(/(^s*) |(s*$)/g, "");
/**
* ファイルがカスタム タイプであるかどうかを判断します
*
* @param {String}filename
* @param {String} タイプ、複数のタイプはカンマで区切られます (例: doc、 docx、txt
* @return {Boolean} true または false
* @api public
*/
var is_filetype = exports.is_filetype = function(ファイル名, タイプ) {
types = types.split(',');
var pattern = '.(';
for(var i=0; iif(0 ! = i) {
パターン = '|';
}
パターン = type[i].trim();
パターン = ' )$';
return new RegExp(pattern, 'i').test(filename);
}); == '未定義') {
window.util = {};
return window.util;
} else {
return エクスポート;
})() );
フロントエンド
コードをコピー
コードは次のとおりです:
バックエンド
コードをコピー
コードは次のとおりです:
var util = require('./public/js/util.js'),
constant = require('./public/js/constant.js');
app.post ('/resume/upload/:job_id', function(req, res, next){
req.form.complete(function(err, フィールド, ファイル){
if(!util.is_filetype(filepath, constant.RESUME_FILETYPES)) {
// クライアントが判断したため、この状況は悪意を持ってアップロードされています。
res.send('ファイル形式エラー: ' ファイルパス
' にファイルをアップロードしてください。 ' constant.RESUME_FILETYPES ' format');
return;
}
// ここでは N 行のコードが省略されています
} );
うわー、もう冗長性はありません!完了
その他の一般的なシナリオ
定数定義
文字列操作などのさまざまな便利なツール モジュール