05.10.2015, 12:59
|
Новичок на форуме
|
|
Регистрация: 03.09.2015
Сообщений: 8
|
|
Как правильно писать на JS?
Добрый день! Написал часть небольшой программы на JS, работает в принципе как надо, но вот вопрос, а правильно ли я пишу в ООП стиле на JS? Так как раньше писал на других языках.
//объект хранящий информацию о картинке
/*var Img = function (src, width, height) {
var _src = src;
var _width = width;
var _height = height;
this.getSrc = function () {
return _src;
}
this.getWidth = function () {
return _width;
}
this.getHeight = function () {
return _height;
}
}*/
function Powell(startX, startY, eps, strFunc, idPlot, idConsole, betweenX_1, betweenX_2, betweenY_1, betweenY_2, idPlot3D, idExpression) {
console.log("startX = " + startX + " startY = " + startY + " eps = " + eps + " strFunc = " + strFunc + " idPlot = " + idPlot +
" idConsole = " + idConsole + " betweenX_1 = " + betweenX_1 + " betweenX_2 = " + betweenX_2 + " betweenY_1 = " + betweenY_1 +
"betweenY_2 = " + betweenY_2 + "idPlot3D = " + idPlot3D + " idExpression = " + idExpression);
// ф-ция запрос на сервер за картинкой и размерами
var objResponse;
var contextCanvas;
var loadOk = 0;
function makeRequest() {
var processingResponse = function () {
if (xmlHttp.readyState == 4 && xmlHttp.status == 200) {
// responseJson - хранится JSON
var responseJson = xmlHttp.responseText;
console.log("State is 4 and 200");
console.log(responseJson);
objResponse = JSON.parse(responseJson);
} else if(xmlHttp.readyState == 4 && xmlHttp.status != 200){
console.log("Error - not internet!!!");
// в случае сетевой ошибки
// ставим картинку по умолчанию
}
}
//формируем строку запроса
var strRequest;
strRequest = "strFunc=" + encodeURIComponent(strFunc) + "&betweenX_1=" + encodeURIComponent(betweenX_1) + "&betweenX_2=" + encodeURIComponent(betweenX_2) +
"&betweenY_1=" + encodeURIComponent(betweenY_1) + "&betweenY_2=" + encodeURIComponent(betweenY_2);
console.log("strRequest = " + strRequest + "\n\n");
//strRequest = encodeURIComponent(strRequest);
//console.log("strRequestEncode = " + strRequest + "\n\n");
var xmlHttp;
xmlHttp = new XMLHttpRequest();
// связываем с данным контекстом
xmlHttp.onreadystatechange = processingResponse;
xmlHttp.open("POST", "/php_backend/lab2.php", false);
xmlHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xmlHttp.send(strRequest);
}
function putImgExtra(objFromJson, idDiv) {
var tagImg = document.createElement("img");
var srcImg = objFromJson.src;
var widthImg = objFromJson.width;
var heightImg = objFromJson.height;
tagImg.setAttribute("src", srcImg);
tagImg.setAttribute("width", widthImg);
tagImg.setAttribute("height", heightImg);
var tagDiv = document.getElementById(idDiv);
if (tagDiv.hasChildNodes()) {
tagDiv.removeChild(tagDiv.firstChild);
}
tagDiv.appendChild(tagImg);
}
function putImgContourInDiv() {
// параметры картинки
var srcImg = objResponse.imgContour.src;
var widthImg = objResponse.imgContour.width;
var heightImg = objResponse.imgContour.height;
// создадим каву
var canvas = document.createElement("canvas");
canvas.setAttribute("width", widthImg);
canvas.setAttribute("height", heightImg);
contextCanvas = canvas.getContext("2d");
var imageObj = new Image();
imageObj.onload = function(){
contextCanvas.drawImage(imageObj, 0, 0);
afterLoadImg();
}
imageObj.src = srcImg;
// посылаем канву в div
var tagDiv = document.getElementById(idPlot);
if (tagDiv.hasChildNodes()) {
tagDiv.removeChild(tagDiv.firstChild);
}
tagDiv.appendChild(canvas);
}
function afterLoadImg(){
contextCanvas.fillRect(0, 0, 100, 100);
}
this.calc = function () {
makeRequest();
console.log("\n\nIMG: " + objResponse.imgContour.src);
// поместить 3D картинку в idPlot3D
putImgExtra(objResponse.img3D, idPlot3D);
putImgExtra(objResponse.imgExpression, idExpression);
putImgContourInDiv();
// while(!loadOk);
}
}
// берем значения из форм
// после создаем объект и у объекста запускаем метод расчета и постройки графика
function start_calc(idForm, idPlot, idConsole, idPlot3D, idExpression) {
var form = document.getElementById(idForm);
var strFunc = form.querySelector("input[name=function]").value;
var startX = parseFloat(form.querySelector("input[name=start_x]").value.replace(",", "."));
var startY = parseFloat(form.querySelector("input[name=start_y]").value.replace(",", "."));
var betweenX_1 = parseFloat(form.querySelector("input[name=between_x_1]").value.replace(",", "."));
var betweenX_2 = parseFloat(form.querySelector("input[name=between_x_2]").value.replace(",", "."));
var betweenY_1 = parseFloat(form.querySelector("input[name=between_y_1]").value.replace(",", "."));
var betweenY_2 = parseFloat(form.querySelector("input[name=between_y_2]").value.replace(",", "."));
var eps = parseFloat(form.querySelector("input[name=eps]").value.replace(",", "."));
//определяем метод - какой объект создать
switch (idForm) {
case "form_pa":
var objPowell = new Powell(startX, startY, eps, strFunc, idPlot, idConsole, betweenX_1, betweenX_2, betweenY_1, betweenY_2, idPlot3D, idExpression);
objPowell.calc();
break;
default:
alert(idForm + " - неопознанная idForm!");
break;
}
}
// нажата кнопка по умолчанию
function insertDefaultValue(idInput){
var tagInput = document.getElementById(idInput);
console.log("Default input = " + idInput);
if (idInput == "fun_pa"){
tagInput.value = "((x*cos(30)+(y-1)*sin(30))^2)/4 + (((y-1)*cos(30)-x*sin(30))^2)/36";
}
}
document.addEventListener("DOMContentLoaded", function () {
// вешаем слушателя на кнопку расчета для метода пауэла
var btnResultPA = document.getElementById("result_pa");
btnResultPA.addEventListener("click", function () {
// ид формы для расчета и ид места куда выводим график и ид на консоль
start_calc("form_pa", "plot_pa", "console_pa", "3d_plot_pa", "expression_pa");
});
// слушатель - кнопка "По умолчанию"
var btnDefault = document.getElementById("default_pa");
// fun_pa - какой график строим (idInput)
btnDefault.addEventListener("click", function(){insertDefaultValue("fun_pa");}, false);
});
|
|
05.10.2015, 13:31
|
Кандидат Javascript-наук
|
|
Регистрация: 19.09.2015
Сообщений: 117
|
|
>>а правильно ли я пишу в ООП стиле на JS
Что то ООП в Вашем коде особо то и не заметно. ООП в смысле порождения собственных абстракций -- объектов/сообщений. Все что я увидел -- вы определили несколько функций, которые используют стандартный функционал. Впрочем, детально не вникал
|
|
05.10.2015, 13:45
|
Новичок на форуме
|
|
Регистрация: 03.09.2015
Сообщений: 8
|
|
Сообщение от sortarray
|
>>а правильно ли я пишу в ООП стиле на JS
Что то ООП в Вашем коде особо то и не заметно. ООП в смысле порождения собственных абстракций -- объектов/сообщений. Все что я увидел -- вы определили несколько функций, которые используют стандартный функционал. Впрочем, детально не вникал
|
Согласен, здесь ООП практически нет, парочка объектов, у которых вызываю методы. Нормально ли это для JS, или код можно более по-умному написать...
|
|
05.10.2015, 14:00
|
Кандидат Javascript-наук
|
|
Регистрация: 19.09.2015
Сообщений: 117
|
|
Сообщение от auditseo
|
Нормально ли это для JS, или код можно более по-умному написать...
|
Многие пишут без ООП, это вопрос предпочтений. Если Вам не нужно, то и не надо, собственно. Сложные приложения конечно, лучше с ООП...
|
|
05.10.2015, 14:57
|
|
CacheVar
|
|
Регистрация: 19.08.2010
Сообщений: 14,206
|
|
auditseo, зачем плодить кучу переменных, таких как
startX, startY и т.п.?
Это может решить массив объектов...
Почему switch для двух вариантов?
Чем тут if/else не угодил?
|
|
06.10.2015, 01:17
|
Новичок на форуме
|
|
Регистрация: 03.09.2015
Сообщений: 8
|
|
Сообщение от ksa
|
auditseo, зачем плодить кучу переменных, таких как
startX, startY и т.п.?
Это может решить массив объектов...
Почему switch для двух вариантов?
Чем тут if/else не угодил?
|
Привык switch + там еще будут дополняться варианты и код сырой, еще много писать.
А вот за первой замечание большое спасибо, больше внимания буду этому уделять.
Хотя в этом же проекте, хотел создать один абстрактный класс, но вот на данный момент, слабое знание ООП в JS не позволило этого сделать, хотя и без абстрактного метода, легко было выйти из положения. Поэтому вопрос: JS нормально приспособлен для абстрактных классов, наследования и т.д.,?
И еще чем лучше дебажить проект, а то я использую только console.log()
|
|
06.10.2015, 02:10
|
|
Профессор
|
|
Регистрация: 15.07.2015
Сообщений: 511
|
|
|
|
06.10.2015, 08:11
|
|
CacheVar
|
|
Регистрация: 19.08.2010
Сообщений: 14,206
|
|
Сообщение от auditseo
|
чем лучше дебажить проект, а то я использую только console.log()
|
Есть еще alert().
|
|
06.10.2015, 14:29
|
Новичок на форуме
|
|
Регистрация: 03.09.2015
Сообщений: 8
|
|
Сообщение от ksa
|
Есть еще alert().
|
Сильные инструменты)
|
|
06.10.2015, 14:51
|
|
CacheVar
|
|
Регистрация: 19.08.2010
Сообщений: 14,206
|
|
Ведь для хорошего
Для рыбака
Удочка только нужна
И река! (с)
|
|
|
|