Как писать Толковый ООП код в JS? Всем доброго времени. Понимаю что вопрос глубокий но хотелось бы понять как писать годный код в ооп. Прогаю относительно недавно и при освоении ооп который должен был упростить код(как часто говорят на харбре))) вытоге уже сума меня сводить начал. Хотелось бы понимание в верном направлении я рою или нагромаздил черти че. Вот пример кода реализуещего на основе localStorage имитацию файловой системы для редактора. к нему еще несколько подобных фалов прилагается const ul = "ul";
const li = "li";
const explorerlist = "explorer-list";
const sublist = 'explorer-sublist-item';
const projects = "projects";
const $toolbar = $("", {
class: "explorer-toolbar"
});
$toolbar.append($("", {
class: "explorer-toolbar-btn material-icons",
title: "Create file",
"data-action": "file-new",
html: 'insert_drive_file'
}));
$toolbar.append($("", {
class: "explorer-toolbar-btn material-icons",
title: "Create folder",
"data-action": "folder-new",
html: 'create_new_folder'
}));
$toolbar.append($("", {
class: "explorer-toolbar-btn material-icons",
title: "Collapse all folders",
"data-action": "collapse-all",
html: 'indeterminate_check_box'
}));
$title = $("", {
"class": "explorer-input-wrapper"
}).append($("", {
"class": "explorer-input-field isBlured",
"type": 'text',
"data-action": "project-name",
"placeholder": "Project Name"
}));
class EXPLORER {
constructor() {
this.treeID = explorerlist;
this.p = {};
this.opened = {};
this.init()
}
init() {
let opened = Local.get("opened");
this.opened["project"] = opened["project"] || 0;
this.opened["files"] = opened.files || [];
Local.set("opened", this.opened);
}
get projects() {
var p = Local.get(projects);
for (var key in p) {
let n = p[key]["name"];
this.p[n] = p[key]
}
return Local.get(projects);
}
get Project() {
var _this = this;
return new class {
open(name) {
$title.attr("data-id", name).val(name);
for (let i = 0; i {
const _file = files.substring(files.indexOf("/") + 1);
_this.file_path[_file] = files
}, _this.file_path);
if (_this.opened["project"] !== "undefined") {
var code = Local.get("projects")[_this.opened.project].files[name];
Workspace.Editors(_this.file_path[name]).create(code[1], _this.file_path[name]);
Workspace.Editors(_this.file_path[name]).instance.setValue(code[0]);
filesArr.push(_this.file_path[name]);
Local.setKey("opened", "files", filesArr);
}
}
close(name) {
let filesArr = Local.getKey("opened", "files");
for (var i = 0; i < filesArr.length; i++)
if (filesArr[i] === name) filesArr.splice(i, 1)
Local.setKey("opened", "files", filesArr);
}
}
}
render() {
this.$explorer = $("#explorer");
this.$filetree = $("", {
class: explorerlist,
id: explorerlist
});
this.$explorer.append($toolbar, $title, this.$filetree);
event(this.$filetree, this);
for (let i = 0; i {
$(document).on('click touchend', elem, e => {
if ($(e.target).parent('li').hasClass(sublist)) {
$(e.target).parent('li').toggleClass('active');
}
if ($(e.target).parent('li').hasClass('explorer-file')) {
let elem = e.target,
str = '';
if (!elem && elem === this.$filetree) return
elem = $(e.target).parent().parent('li');
let dir = elem ? elem.children().text() : '';
str = `${str && dir ? `${dir}/` : dir}${str}`;
}
});
$(document).on('dblclick touchend', elem, e => {
if ($(e.target).parent().hasClass('explorer-file-item')) {
var name = $(e.target).text();
explorer.File.open(name);
}
});
$(document).on("change", $title, (e) => {
var projName = $(e.target).attr("data-id")
var projects = EXPLORER.projects;
for (var key in projects) {
if (projects[key]["name"] == projName) {
projects[key]["name"] = $(e.target).val();
Local.set(projects, projects)
}
}
});
}
function initMode(fileExtension) {
switch (fileExtension) {
case "html" || "xml":
return "htmlmixed";
case "js":
return "javascript";
case "css":
return "css";
}
}
function getFormat(text) {
return text.split(".").pop()
}
Если есть какие статейки на примете подкиньте плз. Те что нашел на харбре и мозиле весьма примитивны и не дают понго представления приминения сих принципов на практике

21 Авг 2019 в 06:57
181 +1
0
Ответы
1

Добрый день! Разберем ваш пример кода, чтобы понять, как его можно улучшить с точки зрения объектно-ориентированного программирования (ООП) на JavaScript.

Разделение на классы и методы.
В вашем коде уже есть класс EXPLORER, который содержит свойства и методы. Однако, можно разделить этот класс на более мелкие классы, например, Project и File, чтобы каждый класс отвечал за свою функциональность.

Использование приватных свойств и методов.
В JavaScript нет прямой поддержки приватных свойств и методов, но их можно эмулировать с помощью замыканий. Например, можно использовать конструкторы с замыканиями для создания "приватных" свойств и методов.

Использование наследования и интерфейсов.
В ООП важно использовать наследование и интерфейсы для повторного использования кода и упрощения архитектуры. Можно создать базовый класс FileSystem, от которого будут наследоваться классы Project и File.

Управление состоянием и обработка событий.
Для работы с состоянием приложения (открытые проекты, файлы и т.д.) можно использовать паттерн управления состоянием, например, Redux. Это позволит сделать код более чистым и предсказуемым.

Обработка ошибок и исключений.
Важно добавить обработку ошибок и исключений в код, чтобы при возникновении проблем приложение не "ломалось" и корректно обрабатывало ошибки.

Если вы хотите углубиться в принципы ООП на JavaScript, рекомендую изучить следующие статьи и материалы:

Официальная документация по ООП на Mozilla Developer Network (https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Objects/Object-oriented_JS)"JavaScript Patterns" Stoyan Stefanov"JavaScript: The Good Parts" Douglas Crockford

Надеюсь, эти советы помогут вам улучшить свой код и изучить принципы ООП на JavaScript. Если у вас есть конкретные вопросы или примеры кода, с удовольствием помогу ими поработать. Удачи в изучении программирования!

20 Апр 2024 в 13:10
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир