Я всегда находил Hibernate немного сложным и трудным для изучения. Но так как JPA (Java Persistence API) и EJB (Enterprise Java Beans) 3.0 уже некоторое время стали намного проще, я предпочитаю комментировать свои классы для создания отображений с помощью JavaDoc или XML. Проверьте поддержку в Hibernate . Дополнительным бонусом является то, что можно (но не без усилий) изменить структуру базы данных позже, если это необходимо. Я использовал OpenJPA с отличными результатами.
В последнее время я все больше и больше использую JCR (Java Content Repository). Мне нравится, как мои модули могут совместно использовать одно хранилище данных и что я могу позволить структуре и свойствам развиваться. Мне гораздо проще работать с узлами и свойствами, чем сопоставлять мои объекты с базой данных. Хорошей реализацией является Jackrabbit .
Что касается Spring, он имеет много функций, которые мне нравятся, но количество XML, необходимое для настройки, означает, что я никогда не буду его использовать. Вместо этого я использую Guice и очень люблю его.
В заключение я бы показал вашим сомневающимся разработчикам, как Hibernate облегчит их жизнь. Что касается Spring, я бы серьезно проверил, является ли Guice жизнеспособной альтернативой, а затем попытался бы показать, как Spring / Guice делает разработку лучше и проще.
Вы можете использовать strtol
и использовать возвращенный endptr
, чтобы проверить, является ли это концом строки (0 байт).
Подсчет будет не обязательно быть точным. «00» приведет к 0, но 0 состоит из одной цифры, а исходная строка имеет длину 2.
LPCSTR lpText = "test";
long lTextLen = CString(lpText).GetLength();
Нет.
Вот как вы находите длину c-строки. Вы можете использовать strlen
, но он все равно должен пройти вниз по всей строке и подсчитать количество символов перед '\ 0'
.
Поговорим о производстве большего количества тепла, чем света ... :) Прекратите использовать «атой», и это решит большинство ваших проблем. 'atoi' - мертвая функция, не имеющая практического значения. Правильный способ преобразовать строковое представление в число - это функции из группы 'strto ...' ('strtol', 'strtoul' и т. Д.). Эти функции вернут вам достаточно информации, чтобы сразу определить, произошла ли ошибка преобразования.
Я бы поступил немного по-другому - инициализировал строковый поток вводом, прочитал int, затем проверил, пуст ли поток:
#include <sstream>
#include <iostream>
typedef char const *LPCSTR;
template <class T>
bool check_read(LPCSTR input, T &val) {
std::istringstream reader(input);
reader >> val;
char ch;
if (reader >> ch) {
std::cerr << "\nUnconverted character: " << ch << std::endl;
return false;
}
return true;
}
int main() {
LPCSTR inputs[] = {"12345", "54321a"};
int a;
for (int i=0; i<2; i++) {
check_read(inputs[i], a);
std::cout << "Converted: " << a << std::endl;
}
return 0;
}
Другой разумной возможностью было бы strtol или one своих кузенов. Они возвращают указатель на первый непреобразованный символ (если есть), поэтому они прямо говорят вам, что было преобразовано, а что нет. Они быстрее, но, как правило, менее гибки, чем потоки - например, если вы хотите прочитать число с плавающей запятой, приведенный выше check_read будет работать как есть, но что-то, использующее strtol, должно быть переписано.
Еще больше возможностей, вы можете рассмотреть Boost lexical_cast (который упакован немного иначе, но очень похож на код выше).