1. C# / Говнокод #11307

    +129

    1. 1
    2. 2
    3. 3
    4. 4
    if (!File.Exists(filePath))
    {
    	throw new FileNotFoundException("File is not a file!", filePath);
    }

    Вот такая вот философия шестилетней давности. Собственное говно :)

    Запостил: anmiles, 26 Июня 2012

    Комментарии (63) RSS

    • в чем гавно?
      Ответить
      • В месседже
        Ответить
        • забавно :))
          Ответить
          • У вашего смайлика вырос второй подбородок
            Ответить
          • На самом деле это мелкософт мудаки, ведь это они спроектировали такую ситуацию когда существующий по заданному пути, объект File, ВНЕЗАПНО файлом не является. И общего родителя в иерархии с Directory я так понимаю тоже нет.
            Если уж и тырить жабу, то в полном объеме.
            File.java
                /**
                 * Tests whether the file or directory denoted by this abstract pathname
                 * exists.
                 *
                 * @return  <code>true</code> if and only if the file or directory denoted
                 *          by this abstract pathname exists; <code>false</code> otherwise
                 */
                boolean exists() {...
                boolean isDirectory() {...
                boolean isFile() {...
            Ответить
            • Life is life.
              File.isFile
              Ответить
            • это пахнет наследием от IO Handler, что в управляемой написанной с нуля среде вряд ли меет смысл
              почему папка и файл должны иметь общего наследника? Composition over Inheritance же.
              Ответить
              • Кстати, тогда такой вопрос - а перечисление файлов и папок реализовано отдельными функциями в духе Directory.files() и Directory.directories() или же единой функцией, возвращающей и то и то?
                Ответить
                • Отвечу сам-себе - да, отдельные функции GetFiles() и GetDirectories().
                  Ответить
              • >почему папка и файл должны иметь общего наследника?
                А вот почему
                Directory.class
                	EnumerateDirectories(String)	
                  	EnumerateDirectories(String, String)
                  	EnumerateDirectories(String, String, SearchOption)	
                  	EnumerateFiles(String)	
                  	EnumerateFiles(String, String)	
                  	EnumerateFiles(String, String, SearchOption)	
                
                	GetDirectories(String)
                    	GetDirectories(String, String)	
                  	GetDirectories(String, String, SearchOption)	
                    	GetFiles(String)	
                    	GetFiles(String, String)
                  	GetFiles(String, String, SearchOption)

                Они явно не могут в абстракцию и наследование.
                http://msdn.microsoft.com/en-us/library/system.io.directory.aspx

                >кстати, тогда такой вопрос - а перечисление файлов и папок реализовано отдельными функциями в духе
                Сразу отвечая и на твой вопрос.
                Ответить
              • А они кстати так и поступили, как я говорил.
                http://msdn.microsoft.com/en-us/library/system.io.filesysteminfo(v=vs.80).aspx
                FileSystemInfo Class
                Provides the base class for both FileInfo and DirectoryInfo objects.
                Ответить
            • Стоп. Это же статический метод File.Exists(filePath)! Тут получается, что этот File просто набор статических хелперов, а не сущность, сопоставленная файлу.
              Ответить
              • А я могу сделать
                File myFile = GetFileFromSomewhere();
                return myFile.Exists();
                Ответить
                • Хм, это какой-то другой File?
                  Ответить
                  • Обсуждали тут уже этот вопрос недавно: есть и статические методы, которые получают строки, и объекты File с методом Exists.
                    Ответить
                    • А не FileInfo случаем зовут те объекты? Что-то не могу в мане найти File с не статиками.
                      Ответить
    • А объект File же может быть папкой, или не?
      Ответить
      • "Если path описывает каталог, этот метод возвращает false."

        http://msdn.microsoft.com/ru-ru/library/system.io.file.exists%28v=vs.90%29.aspx
        Ответить
        • И сразу вознимает вопрос: как проверить существует ли папка?
          Ответить
          • Directory.Exists если следовать логике... х.з. я почти не разбирался в c#.
            Ответить
        • Ну как я и думал (по аналогии со старым VB).
          И тогда в этом послании "File is not a file!" вырисовывается некий сакральный смысл.
          Ответить
      • В сишарпе, как и в жабке, с большой буквы разве не классы пишутся, а с маленькой - обьекты?
        Ответить
        • В приведённом говнокоде так и есть. Resharper для Visual Studio даст по жопе, если сделать по-другому.
          Ответить
          • Странно, что жаваебу это не бросилось в глаза.
            Ответить
            • Он имел в виду объект класса File
              Ответить
              • А зачем создавать обьект класса-утилиты?
                Ответить
                • Это ж ещё посмотреть надо, что он класс-утилита. Я вот не пишу на решётке и не знаю. В Java создают объекты класса File.
                  Ответить
                  • Посмотреть, статический ли метод? В ide - очень долго, да.
                    Ответить
                    • > В ide - очень долго, да.
                      Поставить вижуалстудию. Очень быстро, да.

                      P.S. Отправлял бы на MSDN тогда уж, ибо до него добраться явно проще, чем до IDE.
                      Ответить
                      • Я имел в виду, что у пишущего на сисярпе вопросов
                        >А объект File же может быть папкой, или не?
                        возникать не должно.
                        Ответить
                        • > у пишущего на сисярпе вопросов возникать не должно.

                          Ну так ни я, ни борманд, ни π на решётке не пишем
                          Ответить
                          • сказали они и грустно заплакали
                            Ответить
                          • Ну тогда это не говнокод. И теперь буду знать, что сайт окупирован жаваебами.
                            Ответить
                            • Это говнокод, его говняшность заключается в тексте сообщения.
                              //ОП
                              Ответить
                            • >>ни я, ни борманд, ни π на решётке не пишем
                              >Ну тогда это не говнокод
                              Ваша логика безупречна.
                              Ответить
                              • То, что людям, не пишущим на языке, кажется говнокодом, вовсе не обязано им являться?
                                Ответить
    • И тут подмешались симлинки, мягкие, жесткие, дерзкие... и Ява с наследованием осталась не у дел...
      Ответить
      • А c# все было пофиг... Он все равно ничего кроме папок и файлов не видел.
        Ответить
        • Там тоже есть симлинки. Только что-то мне подсказывает, что они прозрачны и в жабе и в шарпе. В java7 появились методы для работы с симлинками
          http://tinyurl.com/7kygj4r
          , в шестой только воркараунды
          http://tinyurl.com/7pxekgz
          Ответить
          • Ну и так же сделали, статическими методами.
            А на счет Сишарпа - искать лень, но если уж Виста и более новые поддерживают симлинки, я думаю, они бы чего-нибудь в СДК добавили для их определения. Как жеж программы писать тогда?]

            Ха, нашел быстрее чем думал, через p-invoke... мда...
            http://www.pinvoke.net/default.aspx/kernel32.createsymboliclink

            Ответить
            • Они их сделали глубоко через задницу и с ограниченной поддержкой в интерфейсе. Не стоит :)
              Ответить
          • А нам вашей 7-ой жабы не надо.
            У нас есть since 1.2 канонiчные методы.
            public File getCanonicalFile()
                                  throws IOException
            /*
            Returns the canonical form of this abstract pathname. 
            Equivalent to new File(this.getCanonicalPath()).
            Returns:
            The canonical pathname string denoting the same file or directory as this abstract pathname
            */
            public String getCanonicalPath()
                                    throws IOException
            /*Returns the canonical pathname string of this abstract pathname.
            A canonical pathname is both absolute and unique.
            The precise definition of canonical form is system-dependent.
            This method first converts this pathname to absolute form if necessary, as if by invoking the getAbsolutePath() method, and then maps it to its unique form in a system-dependent way.
            This typically involves removing redundant names such as "." and ".." from the pathname,
            resolving symbolic links (on UNIX platforms), and converting drive letters to a standard case (on Microsoft Windows platforms).
            */
            Ответить
      • >и Ява с наследованием осталась не у дел...
        Ну почему это? Как раз наследование тут вполне подходит:
        делаем нового наследника от класса File - типа SymLinkFile. И всё.
        Внутри пишем нужную логику, но внешне это тот же File.
        Ответить
        • А как же симлинк is-a Directory?
          Ответить
          • Ну написано же, выше. Читай по строкам
            >public File getCanonicalFile()
            >Equivalent to new File(this.getCanonicalPath()).
            >The canonical pathname string denoting the same file or directory as this abstract pathname

            Если прочитать другой мой пост http://govnokod.ru/11307#comment144600, то напрашивается ответ:
            new File(this.getCanonicalPath())
            +
            isDirectory()
            =
            file.getCanonicalFile().isDirectory()
            Ответить
            • А как же наследование? в примере выше нет наследования, это то же самое, что foo().bar() нет никакой вообще связи между тем типом, который возвращает foo() и тем типом, который возвращает bar().
              Ответить
              • >>>А как же наследование?
                Объясняю:
                File можно наследовать если хочется
                >делаем нового наследника от класса File - типа SymLinkFile
                и оборачиваем им getCanonicalFile().

                А в C#
                public sealed class FileInfo : FileSystemInfo
                public sealed class DirectoryInfo : FileSystemInfo
                Ответить
                • чет как-то туговато... нет, не получится, если вы будете наследовать от File, то отношение is a Directory в наследника File который не наследуется от Directory в системе разрешаютщей только один супер-класс вы никак не сделаете. То, что вы демонстритуете не имеет отношения, это просто вызов функции которая возвращает объект нужного типа. С наследованием это не связано.
                  Ответить
                  • Я очевидно говорю о другом:
                    Если хочется то в яве _можно_ сделать наследника от File.
                    И тогда new SymLinkFile(path) будет прозрачно отсылать нас к файлу или папке вместо path, который является ссылкой. Внешне же это будет наш File.

                    >То, что вы демонстритуете не имеет отношения
                    Это я указываю способ на то как это можно осуществить.
                    Ответить
                    • Ну так смысл был в том, что осуществить именно через наследование не получится, а то что вообще можно, ну так нужно очень сильно постараться, чтобы вообще никак нельзя было.
                      Ответить
                      • Я не совсем понял этот пост.
                        Вот еще раз, повторюсь
                        >public sealed class FileInfo : FileSystemInfo
                        Ответить
                        • Так это как бы вообще С#, ну да не важно в данном случае.
                          Есть цепочка наследования:
                          Directory <- File
                          Пытаемся добавить симлинк:
                          SymLink <- File
                          Теперь SymLink не может быть Directory потому, что уже наследует File.
                          Исправляем:
                          SymLink <- Directory <- File
                          но, естественно, не все симлинки являются директориями.
                          Исправляем:
                          SymLinkDirectory <- SymLink <- AbstractFile
                          Directory <- File <- AbstracFile
                          Все равно, типы SymLinkDirectory и Directory не совместимы.
                          и т.д.
                          Т.е. нету и в принципе не может быть ситуации в системе не поддерживающей множественное наследование, где возможно реализовать отношение между файлами директориями и симлинками, которое наблюдается в жизни.
                          А то, что это можно сделать кучей других способов - как бы и так понятно.
                          Ответить
                          • >Так это как бы вообще С#
                            А что в ОП посте?
                            А о чем мы вообще говорили изначально?
                            >ну да не важно в данном случае.
                            Очень важно. Речь шла о нем.

                            >в системе не поддерживающей множественное наследование
                            Может. Интерфейсы вы еще не проходили.
                            К тому же я привел пример.
                            Ответить
                            • > И тут подмешались симлинки, мягкие, жесткие, дерзкие... и Ява с наследованием осталась не у дел...

                              Мой пост про Яву и Наследование. Про C# и наследование я не говорил.
                              Интерфейсы - не наследование. Интерфейсы, это другой способ решить задачу.
                              Ответить
                              • >Но это конечно замечательно, потому что - нет объяснения, просто так, потому что думать не хочется.

                                Не хочется думать и внимательно читать чужие посты.

                                >Мой пост про Яву и Наследование.
                                Я привел пример на Яве и Наследованием. И даже _без интерфейсов_

                                >SymLink <- Directory <- File
                                Бгг :D
                                Гениальная находка в области проектирования - наследовать симлинк от папки.
                                >не все симлинки являются директориями.
                                Симлинки ВООБЩЕ не являются директориями.
                                Ответить
                                • > Я привел пример на Яве и Наследованием. И даже _без интерфейсов_
                                  И без наследования, просто с вызовом какого-то метода - таких способов миллион, речь про наследование, а не про то как можно решить проблему без него.

                                  Симлинки могут указывать на директории, этого достаточно для того, чтобы расценивать их как директории, для того такая возможность и существует. Если вас это чем-то не устраивает - то, например, разработчиков графического интерфейса всяких проводников по файловой системе такой подход вполне устраивал. Он так же устраивает другие языки (тот же bash и eLisp, например):
                                  [ -h ./some-symlink ] && echo "is a symlink"
                                  [ -d ./some-symlink ] && echo "is a symlink and a directory"
                                  Ответить
                          • SymLink не может быть Directory, он может лишь указывать на каталог, но не содержать другие файлы. Даже если symlink указывает на каталог, объекты SymLink нужны будут не для того, чтобы перебирать файлы (для этого нам вполне подойдёт обычный Directory, прозрачный по отношению к символическим ссылкам), а для того, чтобы находить реальный путь и выполнять другие операции, специфические именно для символических ссылок.

                            Потому SymLink <: File очень даже подходит. В конце концов, symlink - это просто файл, в котором хранится путь + флажок в inode.
                            Ответить
                            • Как вы проблему решите по-другому - не интерсно. Эту проблему можно решить множеством разных способов. Я вам говорю, что "не можете решить эту проблему с помощью наследования", а вы мне отвечаете: нет, я ее решу лопаткой в песочнице! Нет я ее решу мелом на заборе! И т.д. вы хоть прочитайте одну единственную фразу с которой не соглашаетесь.

                              Следуя вашему описаний симлинка - директория - тоже файл, и тут мы возвращаемся к проблеме типов, что и директория - файл и симлинк файл, но бывают симлинки, которые нужно расценивать как директории, а бывают такие, что нет - и тут наследование не помогает, потому что кто-то решил, что множественное наследование "не нужно" и придумал множество обходных путей как бороться с отсутсвием множественного наследования. Но это конечно замечательно, потому что - нет объяснения, просто так, потому что думать не хочется.
                              Ответить
      • А вот мелкософту с его статикой придется добавить новый набор методов:
        GetSymLinks(String)	
        GetSymLinks(String, String)
        GetSymLinks(String, String, SearchOption)

        к уже существующим:
        http://govnokod.ru/11307#comment144618
        Ответить

    Добавить комментарий