`
zcz123
  • 浏览: 158833 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类

编写超级可读代码的15个最佳实践

阅读更多

 

       一月两次,我们重温Nettuts历史上读者最喜欢的文章。

       代码可读性是一个计算机编程世界的普遍主题。它是我们作为开发者第一件学习的事情。这篇文章将阐述编写可读性代码十五个最重要的最佳实践。


--------------------------------------------------------------------------------

1 – 注释和文档
       集成开发环境IDE在过去的短短几年里走过了很长的路。它使得注释代码比以前更加有用。依照特定标准书写的注释允许IDE和其他工具通过不同的方式来使用它们。

       考虑如下示例:

 


       我在函数定义中添加的注释可以在调用它的地方看到,即便是在其他文件中。

       这里是我另外一个从第三方库中调用函数的例子:

 


       在这些特殊的例子中,使用的注释(或者文档)类型基于PHPDoc,IDE是Aptana。


--------------------------------------------------------------------------------

2 – 一致的排版
       我假定你已经知道了你必须要缩进你的代码。然而,保持排版样式一致仍然是一个好主意。

       这里有不止一种方式来进行代码排版。

第一种:
view plaincopy to clipboardprint?
function foo() {  
    if ($maybe) {  
        do_it_now();  
        again();  
    } else {  
        abort_mission();  
    }  
    finalize();  

function foo() {
 if ($maybe) {
  do_it_now();
  again();
 } else {
  abort_mission();
 }
 finalize();
}

第二种:
view plaincopy to clipboardprint?
function foo()  
{  
    if ($maybe)  
    {  
        do_it_now();  
        again();  
    }  
    else 
    {  
        abort_mission();  
    }  
    finalize();  

function foo()
{
 if ($maybe)
 {
  do_it_now();
  again();
 }
 else
 {
  abort_mission();
 }
 finalize();
}

第三种:
view plaincopy to clipboardprint?
function foo()  
{   if ($maybe)  
    {   do_it_now();  
        again();  
    }  
    else 
    {   abort_mission();  
    }  
    finalize();  

function foo()
{ if ($maybe)
 { do_it_now();
  again();
 }
 else
 { abort_mission();
 }
 finalize();
}

       我曾经使用第二种样式但是最近换为第一种。但是这仅仅只代表了一种偏爱。这里并没有每个人必须要遵守的“最好的”样式。事实上,最佳的样式,就是一致的样式。如果你是一个小组的一部分或者你在为一个项目贡献代码,你必须依照这个项目之前使用的样式。

       排版的样式总不是完全和另外一个不同。有时,它们混合了多种不同的规则。例如,按照PEAR编码标准,前括弧“{”和控制结构在同一行上,但是在功能定义后放在第二行上。

PEAR样式:

view plaincopy to clipboardprint?
function foo()  
{                     // placed on the next line  
    if ($maybe) {     // placed on the same line  
        do_it_now();  
        again();  
    } else {  
        abort_mission();  
    }  
    finalize();  

function foo()
{                     // placed on the next line
    if ($maybe) {     // placed on the same line
        do_it_now();
        again();
    } else {
        abort_mission();
    }
    finalize();
}

       同时注意它们使用4个空格而不是Tab来缩进。

       这里有一个维基百科的文章,里面有许多不同排版样式的例子。


--------------------------------------------------------------------------------

3 – 避免显而易见的注释
       为代码添加注释是效果显著的;但是,它可能太过或者只是多余的文本。像如下例子:

view plaincopy to clipboardprint?
// get the country code  
$country_code = get_country_code($_SERVER['REMOTE_ADDR']);  
// if country code is US  
if ($country_code == 'US') {  
    // display the form input for state  
    echo form_input_state();  

// get the country code
$country_code = get_country_code($_SERVER['REMOTE_ADDR']);
// if country code is US
if ($country_code == 'US') {
 // display the form input for state
 echo form_input_state();
}  

       如果注释内容都是显而易见的,它们并没有提高工作效率。如果你必须要注释这些代码,你可以简单的把它们合并在一行:

view plaincopy to clipboardprint?
// display state selection for US users  
$country_code = get_country_code($_SERVER['REMOTE_ADDR']);  
if ($country_code == 'US') {  
    echo form_input_state();  

// display state selection for US users
$country_code = get_country_code($_SERVER['REMOTE_ADDR']);
if ($country_code == 'US') {
 echo form_input_state();
}


--------------------------------------------------------------------------------

4 – 代码分组
       确定的任务多半需要多行代码。使用一些空白将这些任务的代码分隔为几段是一个好主意。

       这是一个简单的示例:

view plaincopy to clipboardprint?
// get list of forums  
$forums = array();  
$r = mysql_query("SELECT id, name, description FROM forums");  
while ($d = mysql_fetch_assoc($r)) {  
    $forums []= $d;  
}  
// load the templates  
load_template('header');  
load_template('forum_list',$forums);  
load_template('footer'); 
// get list of forums
$forums = array();
$r = mysql_query("SELECT id, name, description FROM forums");
while ($d = mysql_fetch_assoc($r)) {
 $forums []= $d;
}
// load the templates
load_template('header');
load_template('forum_list',$forums);
load_template('footer'); 

       在每一段之前添加注释也增强了视觉上的分隔。

      


--------------------------------------------------------------------------------

5 – 命名的一致性
       PHP有些时候在遵守命名一致性方面有很大问题:

strops()和str_split()
imagetypes()和image_type_to_extension()
       首先,这些命名必须有单词的分界线。有两种流行的选择:

骆驼命名法:除了第一个单词外,每个单词的第一个字符大写。
下划线命名法: 单词间采用下划线,例如mysql_real_escape_string()。
       像我之前提到的一样,采用不同的命名选择会创建和排版样式类似的情形。如果一个已有的项目遵照一个确定的习惯,你必须遵守它。同时,某些语言平台倾向于使用特定的命名规则。例如Java里,大多数代码使用骆驼命名法;在PHP里大多采用下划线命名法。

       它们也可以混用。一些开发者喜欢在程序函数和类名上使用下划线命名,但是在类方法名上使用骆驼命名。

view plaincopy to clipboardprint?
class Foo_Bar {  
    public function someDummyMethod() {  
    }  
}  
function procedural_function_name() {  

class Foo_Bar {
 public function someDummyMethod() {
 }
}
function procedural_function_name() {
}

       所以,没有明显的“最好的”样式,只需要保持一致。


--------------------------------------------------------------------------------

6 – DRY原则
       DRY即不要重复你自己。也被称为DIE:重复是恶魔。

       这个原则规定:

      “在一个系统里每一个知识的片段必须有一个单一、明确、权威的表现。”

       大多数应用程序(或者通常的计算机)的目的是让重复的任务自动化。这个原则在所有的代码,即使Web程序中也应该保持。代码的相同片段不应该多次重复。

       例如,大多数Web程序由许多页面组成。这些页面很可能包含相同的元素。页头和页脚经常符合这个条件。复制和粘贴这些页头和页尾到每一个页面中不是一个好主意。这是Jeffrey Way解释如何在CodeIgniter里创建模版的链接。

view plaincopy to clipboardprint?
$this->load->view('includes/header');  
$this->load->view($main_content);  
$this->load->view('includes/footer'); 
$this->load->view('includes/header');
$this->load->view($main_content);
$this->load->view('includes/footer');


--------------------------------------------------------------------------------

7 – 避免过深的嵌套
       太多层的嵌套会造成代码阅读和跟踪困难。

view plaincopy to clipboardprint?
function do_stuff() {  
// ...  
    if (is_writable($folder)) {  
        if ($fp = fopen($file_path,'w')) {  
            if ($stuff = get_some_stuff()) {  
                if (fwrite($fp,$stuff)) {  
                    // ...  
                } else {  
                    return false;  
                }  
            } else {  
                return false;  
            }  
        } else {  
            return false;  
        }  
    } else {  
        return false;  
    }  

function do_stuff() {
// ...
 if (is_writable($folder)) {
  if ($fp = fopen($file_path,'w')) {
   if ($stuff = get_some_stuff()) {
    if (fwrite($fp,$stuff)) {
     // ...
    } else {
     return false;
    }
   } else {
    return false;
   }
  } else {
   return false;
  }
 } else {
  return false;
 }
}

       为了可读性,通常需要修改代码来减少嵌套的层数。

view plaincopy to clipboardprint?
function do_stuff() {  
// ...  
    if (!is_writable($folder)) {  
        return false;  
    }  
    if (!$fp = fopen($file_path,'w')) {  
        return false;  
    }  
    if (!$stuff = get_some_stuff()) {  
        return false;  
    }  
    if (fwrite($fp,$stuff)) {  
        // ...  
    } else {  
        return false;  
    }  

function do_stuff() {
// ...
 if (!is_writable($folder)) {
  return false;
 }
 if (!$fp = fopen($file_path,'w')) {
  return false;
 }
 if (!$stuff = get_some_stuff()) {
  return false;
 }
 if (fwrite($fp,$stuff)) {
  // ...
 } else {
  return false;
 }
}


--------------------------------------------------------------------------------

8 – 减少行的长度
       我们的眼睛对于阅读高和窄的文本列更感觉舒适。这就是为什么报纸文章看起来像如下样子的原因:

 


       避免在一行上编写过长的代码是一个最佳实践。

view plaincopy to clipboardprint?
// bad  
$my_email->set_from('test@email.com')->add_to('programming@gmail.com')->set_subject('Methods Chained')->set_body('Some long message')->send();  
// good  
$my_email  
    ->set_from('test@email.com')  
    ->add_to('programming@gmail.com')  
    ->set_subject('Methods Chained')  
    ->set_body('Some long message')  
    ->send();  
// bad  
$query = "SELECT id, username, first_name, last_name, status FROM users LEFT JOIN user_posts USING(users.id, user_posts.user_id) WHERE post_id = '123'";  
// good  
$query = "SELECT id, username, first_name, last_name, status  
    FROM users  
    LEFT JOIN user_posts USING(users.id, user_posts.user_id)  
    WHERE post_id = '123'"; 
// bad
$my_email->set_from('test@email.com')->add_to('programming@gmail.com')->set_subject('Methods Chained')->set_body('Some long message')->send();
// good
$my_email
 ->set_from('test@email.com')
 ->add_to('programming@gmail.com')
 ->set_subject('Methods Chained')
 ->set_body('Some long message')
 ->send();
// bad
$query = "SELECT id, username, first_name, last_name, status FROM users LEFT JOIN user_posts USING(users.id, user_posts.user_id) WHERE post_id = '123'";
// good
$query = "SELECT id, username, first_name, last_name, status
 FROM users
 LEFT JOIN user_posts USING(users.id, user_posts.user_id)
 WHERE post_id = '123'";

       同时,如果任何人想要在例如Vim这样的终端窗口中阅读代码,限制每一行的长度在80个字符以内是一个好主意。


--------------------------------------------------------------------------------

9 – 代码结构
       理论上,你可以将整个应用代码写在一个文件里。但是对于阅读和维护来说是一个噩梦。

       在我的第一个编程项目中,我知道创建“包含文件”的含义。但是,我并没有好好进行组织。我创建了一个“inc”文件夹,放置了两个文件:db.php、functions.php。当程序变大时,functions文件也变得越来越大并难以维护。

       最好的方法之一是采用框架或者模仿它们的文件夹结构。下面是CodeIgniter的文件结构:

 

 

--------------------------------------------------------------------------------

10 – 统一的临时变量名
       通常,变量名应该是描述性的并且包含一个或者更多的单词。但是,这对临时变量来说并不是必须的。它们可以短到只有一个单独字符。

       最佳实践是:对于有同样职责临时变量采用统一的命名。这里有一些我倾向于在代码里使用的例子:

view plaincopy to clipboardprint?
// $i for loop counters  
for ($i = 0; $i < 100; $i++) {  
    // $j for the nested loop counters  
    for ($j = 0; $j < 100; $j++) {  
    }  
}  
// $ret for return variables  
function foo() {  
    $ret['bar'] = get_bar();  
    $ret['stuff'] = get_stuff();  
    return $ret;  
}  
// $k and $v in foreach  
foreach ($some_array as $k => $v) {  
}  
// $q, $r and $d for mysql  
$q = "SELECT * FROM table";  
$r = mysql_query($q);  
while ($d = mysql_fetch_assocr($r)) {  
}  
// $fp for file pointers  
$fp = fopen('file.txt','w'); 
// $i for loop counters
for ($i = 0; $i < 100; $i++) {
 // $j for the nested loop counters
 for ($j = 0; $j < 100; $j++) {
 }
}
// $ret for return variables
function foo() {
 $ret['bar'] = get_bar();
 $ret['stuff'] = get_stuff();
 return $ret;
}
// $k and $v in foreach
foreach ($some_array as $k => $v) {
}
// $q, $r and $d for mysql
$q = "SELECT * FROM table";
$r = mysql_query($q);
while ($d = mysql_fetch_assocr($r)) {
}
// $fp for file pointers
$fp = fopen('file.txt','w');


--------------------------------------------------------------------------------

11 – SQL关键词大写
       数据库交互对于大多数Web应用来说是很大一个组成部分。如果你正在编写SQL查询,尽量保持它们可读。

       即使SQL关键词和函数名是大小写无关的,大写来将它们从表名和列名中区分出来是一个通用的实践。

view plaincopy to clipboardprint?
SELECT id, username FROM user;  
UPDATE user SET last_login = NOW()  
WHERE id = '123' 
SELECT id, username FROM user u  
LEFT JOIN user_address ua ON(u.id = ua.user_id)  
WHERE ua.state = 'NY' 
GROUP BY u.id  
ORDER BY u.username  
LIMIT 0,20 
SELECT id, username FROM user;
UPDATE user SET last_login = NOW()
WHERE id = '123'
SELECT id, username FROM user u
LEFT JOIN user_address ua ON(u.id = ua.user_id)
WHERE ua.state = 'NY'
GROUP BY u.id
ORDER BY u.username
LIMIT 0,20


--------------------------------------------------------------------------------

12 – 代码和数据分离
       这是另外一个对于所有环境下的绝大多数编程语言都适用的原则。在Web开发中,数据通常意味着HTML输出。

       当PHP许多年前第一次发布时,它最开始被看作是一个模版引擎。在巨大的HTML文件里插入一些PHP代码行是非常普通的。但是,这些年来,事情发生了改变:网站变得越来越动态化和功能化。代码已经是Web程序的一个很大的部分,将它们和HTML合并在一起并不是一个好的实践。

       你可以在你的程序中应用这个原则,或者你可以使用一个第三方工具(模版引擎、框架或者CMS系统)或者依照它们的习惯。

       流行的PHP框架:

CodeIgniter
Zend Framework
Cake PHP
Symfony
       流行的模版引擎:

Smarty
Dwoo
Savant
       流行的CMS系统:

Joomla
Drupal

--------------------------------------------------------------------------------

13 – 模版内的交替格式
       你可以选择不使用一个奇特的模版引擎,取而代之的是在模版文件里使用纯内联的PHP代码。这不是必须要违反“数据和代码分离“,只是内联代码是直接和输出相关的,并且可读。在这种情况下你可以考虑使用交替格式来控制结构。

       这是一个示例:

view plaincopy to clipboardprint?
<div class="user_controls">  
    <?php if ($user = Current_User::user()): ?>  
        Hello, <em><?php echo $user->username; ?></em> <br/>  
        <?php echo anchor('logout', 'Logout'); ?>  
    <?php else: ?>  
        <?php echo anchor('login','Login'); ?> |  
        <?php echo anchor('signup', 'Register'); ?>  
    <?php endif; ?>  
</div>  
<h1>My Message Board</h1>  
<?php foreach($categories as $category): ?>  
    <div class="category">  
        <h2><?php echo $category->title; ?></h2>  
        <?php foreach($category->Forums as $forum): ?>  
            <div class="forum">  
                <h3>  
                    <?php echo anchor('forums/'.$forum->id, $forum->title) ?>  
                    (<?php echo $forum->Threads->count(); ?> threads)  
                </h3>  
                <div class="description">  
                    <?php echo $forum->description; ?>  
                </div>  
            </div>  
        <?php endforeach; ?>  
    </div>  
<?php endforeach; ?> 
<div class="user_controls">
 <?php if ($user = Current_User::user()): ?>
  Hello, <em><?php echo $user->username; ?></em> <br/>
  <?php echo anchor('logout', 'Logout'); ?>
 <?php else: ?>
  <?php echo anchor('login','Login'); ?> |
  <?php echo anchor('signup', 'Register'); ?>
 <?php endif; ?>
</div>
<h1>My Message Board</h1>
<?php foreach($categories as $category): ?>
 <div class="category">
  <h2><?php echo $category->title; ?></h2>
  <?php foreach($category->Forums as $forum): ?>
   <div class="forum">
    <h3>
     <?php echo anchor('forums/'.$forum->id, $forum->title) ?>
     (<?php echo $forum->Threads->count(); ?> threads)
    </h3>
    <div class="description">
     <?php echo $forum->description; ?>
    </div>
   </div>
  <?php endforeach; ?>
 </div>
<?php endforeach; ?>

       这让你避免了许多大括号。同时代码看起来和HTML的结构和排版相似。


--------------------------------------------------------------------------------

14 – 面向对象 vs 面向程序
       面向对象编程可以帮助你创建结构化代码。但是这不代表你完全排除程序化编程。事实上创建两者混合的风格是非常棒的。

       描述数据,通常是数据库里的数据,必须使用对象。

view plaincopy to clipboardprint?
class User {  
    public $username;  
    public $first_name;  
    public $last_name;  
    public $email;  
    public function __construct() {  
        // ...  
    }  
    public function create() {  
        // ...  
    }  
    public function save() {  
        // ...  
    }  
    public function delete() {  
        // ...  
    }  

class User {
 public $username;
 public $first_name;
 public $last_name;
 public $email;
 public function __construct() {
  // ...
 }
 public function create() {
  // ...
 }
 public function save() {
  // ...
 }
 public function delete() {
  // ...
 }
}

       程序化方法常用于可以独立执行的特定任务。

view plaincopy to clipboardprint?
function capitalize($string) {  
    $ret = strtoupper($string[0]);  
    $ret .= strtolower(substr($string,1));  
    return $ret;  

function capitalize($string) {
 $ret = strtoupper($string[0]);
 $ret .= strtolower(substr($string,1));
 return $ret;
}


--------------------------------------------------------------------------------

15 – 阅读开源代码
       开源项目是许多开发者一起构建的。这些项目必须保持高度的代码可读性,以便他们可以尽可能高效的协同工作。

       因此,通读这些项目的源代码来观察这些开发者是如何工作的是非常棒的方法。

 

 

--------------------------------------------------------------------------------

16 – 代码重构
       当你“重构“,你在不改变功能的情况下调整代码。你可以把它看作是“清理”,为了改进代码质量和可读性。

       这并不包括bug的修复或者添加新功能。你可以重构你之前编写的代码,当它们在你头脑你还保持新鲜的时候,以便于你两个月以后有可能回顾代码时更加可读和可重用。就像那句格言所说的一样:“尽早重构,经常重构“。

       你可以在重构期间应用以上任何关于代码可读性的“最佳实践“。我希望你喜欢这篇文章!我遗忘了什么?请通过回复告知我。

網址:http://blog.csdn.net/hfahe/archive/2011/04/05/6303585.aspx

分享到:
评论

相关推荐

    flash actionscript3 as3编写的 超级玛丽 超级马里奥 游戏 源代码.zip

    通过研究这个开源项目,开发者不仅可以学习到AS3的基础语法和面向对象编程,还能了解到游戏开发中的关键技术和最佳实践,如游戏循环、动画制作、碰撞检测以及性能优化。这些知识对于任何希望涉足2D游戏开发的程序员...

    源代码:超级解霸2.0源代码STHVCD2

    源代码是程序设计的基础,它是由程序员编写的、人类可读的编程语言文本,包含了程序的所有逻辑和指令。超级解霸2.0的源代码揭示了该软件的内部工作机制,包括视频解码、音频处理、用户界面设计等多个方面的技术细节...

    游戏-超级玛丽的源代码

    在阅读源代码时,我们可以学习到错误处理、异常安全性和代码可维护性的最佳实践。 总的来说,通过研究《超级玛丽》的源代码,我们可以深入理解游戏开发的原理,掌握编程技巧,了解如何构建一个复杂的游戏系统,并...

    M4存储王录像机去超级用户代码

    通过去超级用户代码,管理员可以限制个别用户的权限,确保系统安全并遵循最佳实践。 VB(Visual Basic)和VB.NET是微软开发的两种编程语言,它们在这里可能是实现这一功能的编程环境。VB是一种基于事件驱动的编程...

    超级马里奥源代码资源.zip

    通过学习这些源代码,开发者不仅可以掌握Python和Pygame的基本用法,还能了解游戏开发的最佳实践。例如,如何优化性能以确保游戏流畅运行,如何设计友好的用户界面,以及如何调试和测试代码以消除bug。 此外,解压...

    OpenGL超级宝典第五版源代码及开发库

    OpenGL超级宝典第五版源代码及开发库是一个珍贵的学习资源,包含了OpenGL编程的详细示例和作者自编的开发库,适用于Linux和Windows操作系统。这个压缩包特别关注了在Windows环境下使用Visual Studio 2013进行配置,...

    超级解霸2.0源代码

    在C语言编程中,源代码是程序员用人类可读的语句编写的文本文件,通过编译器转换成计算机可以执行的机器码。学习《超级解霸2.0源代码》可以帮助我们深入了解以下几个C语言和软件开发的关键知识点: 1. **函数与模块...

    毕业设计管理系统源代码超级经典集合2

    "超级经典"暗示这些源代码代表了在管理系统开发中的成熟、高效或典型实现,可能包含了一些常用的设计模式、算法和最佳实践。 【描述分析】 描述中的"管理系统源代码超级经典集合2"是对标题的重复,进一步强调这是一...

    读易库到超级列表框1.0.zip易语言程序源码资源下载

    在这个“读易库到超级列表框1.0.zip”压缩包中,包含的是一个易语言程序的源代码资源,主要用于演示或教学如何将数据从易库读取并显示在超级列表框组件上。这个程序可能是一个实用的小工具,适用于初学者进行项目...

    动态代码生成器动态代码生成器动态代码生成器

    10. **最佳实践**:在实际应用中,合理利用动态代码生成可以提高代码的可维护性和可扩展性。但过度依赖动态生成的代码可能会导致代码难以理解和维护,因此需适度使用。 总之,动态代码生成器是一个强大的工具,它...

    基于协程的编程方式在移动研发的最佳实践.pdf

    本篇文章主要探讨了基于协程的编程方式在移动端研发中的最佳实践,尤其是在大型超级App如手机淘宝等面临的问题与挑战,并提出了一种可能的未来发展方向。 首先,文章提到了超级App在性能和代码质量上的痛点。多线程...

    超级模块6.8完整版源码

    源码是理解软件工作方式的最佳途径,通过阅读和分析源码,开发者可以学习到最佳实践、设计模式以及特定技术的实现细节。 【标签】包括“模块”,“注入”,“源码”,“辅助”。这些标签提供了关于这个超级模块的...

    Manning.PHP.in.Action 源代码

    该书提供的源代码包含了大量的示例和练习,帮助读者理解并掌握PHP的核心概念、设计模式以及最佳实践。 源代码文件是学习和探索书中内容的关键部分,它们通常按照章节或主题组织,对应书中的各个实例。通过分析和...

    超级模块8.0源码

    【超级模块8.0源码】是一套完整的高级软件开发组件,它包含了丰富的功能和优化的性能,旨在为开发者提供一个高效、...通过深入研究和实践,开发者不仅能掌握先进技术和最佳实践,还能为自己的项目注入更多创新元素。

    在Linux中“超级用户shell”的生成.pdf

    【在Linux中“超级用户shell”的生成】 ...虽然这种方法可以提供灵活性,但必须小心处理,遵循最佳安全实践,以防止潜在的安全风险。在实际操作中,应遵循最小权限原则,只给予用户完成任务所需的最小权限。

    很多的超级模块

    6. **最佳实践**: - **遵循模块化原则**:避免在一个模块中混合不相关的功能,保持模块的单一职责。 - **版本管理**:使用版本控制系统(如Git)来跟踪代码变更,便于协作和回溯。 - **代码质量**:遵循编码规范...

    易语言 超级模块3.2的源码

    源码分析是提升编程技能的重要途径,通过阅读和理解别人的代码,我们可以学习到不同的编程思路和技巧,同时也能发现易语言的各种编程规范和最佳实践。 “超级模块-验证.e”可能涉及到模块的验证机制,这在软件开发...

    超级模块源码

    【超级模块源码】是一个专有名词,通常指的是在编程领域中,为了实现特定功能或一组功能而构建的大规模、可复用的代码库。在软件开发中,模块化是组织代码的重要方式,它能让代码更易于理解、维护和扩展。超级模块...

    超级玛丽游戏GUI(JAVA源码+论文+视频)

    阅读论文有助于深化对游戏开发原理的理解,学习到最佳实践和技巧。 视频教程则提供了一步一步的指导,让初学者能够跟着操作,逐步掌握游戏开发的关键技能。视频通常会演示如何搭建项目环境、组织代码结构、调试运行...

    PHP 高手之路PHP是一门高效的网络编程语言

    总的来说,成为一名PHP高手需要理解并实践上述原则,不断学习和积累,同时保持对新技术和最佳实践的关注。在实际编程中,不仅要关注解决问题,还要注重代码的品质和性能,这样才能在PHP的世界里游刃有余。

Global site tag (gtag.js) - Google Analytics