есть структуры которых уже больше 2 десятков. помогите улучшить код. а именно какой код можно объединить в этих 2 структурах (остальные структуры похожи на эти)
class Structure_FBX_Document
private Structure_FBX_Header_Extension fbx_header_extension;
private String file_Id;
private Structure_Date creationTime;
private String creator;
private Structure_FBX_Global_Settings globalSettings;
private Structure_FBX_Documents documents;
private Structure_FBX_References references;
private Structure_FBX_Definitions definitions;
private Structure_FBX_Objects objects;
private Structure_FBX_Connections connections;
private Structure_FBX_Takes takes;
public FBX_Structure_Document(List<FBX_Node> nodes)
{
for (int i = 0; i < nodes.size(); i++)
{
FBX_Node child = nodes.get(i);
if (child.getName().equals("FBXHeaderExtension"))
fbx_header_extension = new Structure_FBX_Header_Extension(child);
else if (child.getName().equals("FileId"))
file_Id = nodes.get(i).getProperty(0).toString();
else if (child.getName().equals("CreationTime"))
creationTime = new Structure_Date(child.getProperty(0));
else if (child.getName().equals("Creator"))
creator = nodes.get(i).getProperty(0).toString();
else if (child.getName().equals("GlobalSettings"))
globalSettings = new Structure_FBX_Global_Settings(child);
else if (child.getName().equals("Documents"))
documents = new Structure_FBX_Documents(child);
else if (child.getName().equals("References"))
references = new Structure_FBX_References(child);
else if (child.getName().equals("Definitions"))
definitions = new Structure_FBX_Definitions(child);
else if (child.getName().equals("Objects"))
objects = new Structure_FBX_Objects(child);
else if (child.getName().equals("Connections"))
connections = new Structure_FBX_Connections(child);
else if (child.getName().equals("Takes"))
takes = new Structure_FBX_Takes(child);
else
{
try
{
throw new Exception("Тип не найден: " + child.getName());
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
}
// ниже идут геттеры
class Structure_FBX_Definitions
private int version;
private int count;
private List<Structure_Object_Type> object_typeList = new ArrayList<Structure_Object_Type>();
public Structure_FBX_Definitions(FBX_Node node)
{
super(node);
for (int i = 0; i < node.getSize_Children(); i++)
{
FBX_Node child = node.getChild(i);
if (child.getName().equals("Version")) version = Integer.parseInt(child.getProperty(0).toString());
else if (child.getName().equals("Count")) count = Integer.parseInt(child.getProperty(0).toString());
else if (child.getName().equals("ObjectType")) object_typeList.add(new Structure_Object_Type(child));
}
}
// ниже идут геттеры
По порядку:
1.Называйте классы правильно!
Для разделения слов в именах классов и переменных используют CamelCase или snake_case - у Вас и первое и второе.
Выберите что-то одно, пожалуйста.
Причём по отдельности Вы тоже их используете:
private Structure_Date creationTime;
Читать такую "кашу" очень непросто.
Кроме того в Java есть конвенции и имена классов принято именовать CamelCase'ом (так что выбора у Вас нет)
Дальше!
2. Вы создаёте переменную и забываете её использовать
Перед циклом вы создаёте переменную
FBX_Node child = nodes.get(i);
А потом дважды обращаетесь к той же ноде через nodes.get(i)
.
else if (child.getName().equals("FileId"))
file_Id = nodes.get(i).getProperty(0).toString();
//...
else if (child.getName().equals("Creator"))
creator = nodes.get(i).getProperty(0).toString();
Не надо так.
Создал переменную - используй её!
Вы путаете читателя: в условие используете одну ссылку, в следствии-другую...поди догадайся что это одно и тоже в сотне ифов.
3. Используйте switch!
Серьёзно, это просто ужас...такого нагромождения кода я давно не видел...
не лучше ли Всё сделать так:
switch (child.getName()){
case "FBXHeaderExtension":
fbxHeaderExtension = new StructureFBXHeaderExtension(child);
break;
case "FileId":
fileId = child.getProperty(0).toString();
break;
case "CreationTime":
creationTime = new StructureDate(child.getProperty(0));
break;
case "Creator":
creator = child.getProperty(0).toString();
break;
case "GlobalSettings":
globalSettings = new StructureFBXGlobalSettings(child);
break;
case "Documents":
documents = new StructureFBXDocuments(child);
break;
case "References":
references = new StructureFBXReferences(child);
break;
case "Definitions":
definitions = new StructureFBXDefinitions(child);
break;
case "Objects":
objects = new StructureFBXObjects(child);
break;
case "Connections":
connections = new StructureFBXConnections(child);
break;
case "Takes":
takes = new StructureFBXTakes(child);
break;
default:
throw new TypeNotFoundException("Тип не найден: " + child.getName());
break;
}
Это конечно, тоже портянка та ещё, но тут можно быстро найти нужный участок кода и мгновенно понять что он делает, а в Вашем случае всё выглядит гораздо тяжелее.
Что со свитчем можно сделать мы ещё дальше разберёмся.
4.Exception !
Начнём с того, что Exception и без того спорная вещь и её наличие в Jav'е подвергается множеству нападок как со стороны, так и изнутри Java-коммюнити.
Но, если уж Вы и решились на использование исключений, то делайте это правильно.
4.1 Тип исключения.
Нет ничего хуже использования нетипизированного исключения!!!
Уровнем Выше Вы не сможете отличить NullPointerException
от своего исключения. Вам придётся перехватывать все исключения подряд, а это не есть хорошо, т.к. Вы можете пропустить и проигнорировать реальные ошибки, считая их очередным пропущенным "типом".
Вернее будет создать класс TypeNotFoundException
наследованный от Exception
и выбросить уже его в кейсе. Тем самым Вы сможете легко опознать данную ошибку в любой точке своей программы, Вам не нужно будет перекрывать весь поток ошибок и не нужно будет их все перебирать. Более того в самом классе исключения Вы сможете вывести дополнительную информацию по ноде удобным Вам образом.
4.2 Использование исключения и уровни управления.
try
{
throw new Exception("Тип не найден: " + child.getName());
}
catch (Exception e)
{
e.printStackTrace();
}
Какой в этом смысл?
Смысл исключения в том, чтобы эскалировать проблему на ряд уровней выше, в то место программы, где данная проблема может быть решена. Предполагается, что в месте выброса исключения Вы не можете оценить серьёзность ошибки и предпринять какие-либо действия для её обработки. Самая распространённая ошибка - это перехват исключения раньше времени(по всей видимости из-за боязни ошибок), что приводит в итоге к непредвиденному поведению программы. Однако, в Вашем случае Вы просто не понимаете зачем их вообще использовать.
Вы выбрасываете исключение и тут же его ловите для того чтобы просто вывести, что Вы не обработали какой-либо тип. Для начала Вы должны понять - является ли это для Вас исключительной ситуацией?
Если нет, то Вы могли с тем же успехом использовать Log
или вообще System.out.println("Тип не найден: " + child.getName());
Если же да и в будущем, это будет исключительной ситацией и только на момент отладки Вы сразу же перехватили это исключение, то наилучшим решением будет сразу же перенести обработку данного исключения в то место, где Вы сможете решить, что с ним стоит делать.
5. Общие пожелания
Разберитесь с паттернами проектирования.
MUST READ:
Для того чтобы глубже понимать язык, на котором Вы программируете и проектирование объектно-ориентированных программ.
Также настоятельно советую к прочтению книгу "Рефакторинг" Мартина Фаулера, которая поможет применять полученные в вышеупомянутых книгах знания и поэтапно улучшать свой код, делая его читабельнее, красивее, удобнее, полезнее и т.д.
В частности Вам тут определённо может помочь один из Порождающих шаблонов или же Замена условного оператора полиморфизмом, однако для более точного ответа маловато кода, чтобы подобрать вариант оптимальный в Вашем случае.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Здравствуйте! Есть класс-роутер, который проверяет URI и на его основании составляет внутренний маршрут в системеСтолкнулся с проблемой при...
Я могу запускать команды, git add, git commit, прямо из GitНо есть ли какие-либо методы, чтобы я мог запускать команды непосредственно из java
Недавно начал заниматься в Android StudioПостоянно обращаюсь для решения вопросов на этот ресурс