代码_代码生成工具 - CSDN
代码 订阅
代码就是程序员用开发工具所支持的语言写出来的源文件,是一组由字符、符号或信号码元以离散形式表示信息的明确的规则体系。代码设计的原则包括唯一确定性、标准化和通用性、可扩充性与稳定性、便于识别与记忆、力求短小与格式统一以及容易修改等。 源代码是代码的分支,某种意义上来说,源代码相当于代码。现代程序语言中,源代码可以书籍或磁带形式出现,但最为常用格式是文本文件,这种典型格式的目的是为了编译出计算机程序。计算机源代码最终目的是将人类可读文本翻译成为计算机可执行的二进制指令,这种过程叫编译,它由通过编译器完成。 展开全文
代码就是程序员用开发工具所支持的语言写出来的源文件,是一组由字符、符号或信号码元以离散形式表示信息的明确的规则体系。代码设计的原则包括唯一确定性、标准化和通用性、可扩充性与稳定性、便于识别与记忆、力求短小与格式统一以及容易修改等。 源代码是代码的分支,某种意义上来说,源代码相当于代码。现代程序语言中,源代码可以书籍或磁带形式出现,但最为常用格式是文本文件,这种典型格式的目的是为了编译出计算机程序。计算机源代码最终目的是将人类可读文本翻译成为计算机可执行的二进制指令,这种过程叫编译,它由通过编译器完成。
信息
外文名
code
定    义
开发工具支持的语言写的源文件
拼    音
dài mǎ
中文名
代码
操作者
程序员
代码词语解释
供把资料和指示输入自动计算机或制表机的任何符号系统;亦指这种符号的记录(如靠打孔资料卡片或磁带上的受磁点)。
收起全文
精华内容
参与话题
  • c++经典代码大全

    千次下载 热门讨论 2020-07-30 23:33:29
    c++经典代码大全,别人向我推荐的,初学者可以看看。。
  • 各种游戏(源代码

    2020-07-29 14:20:14
    初学时不知道做些什么 那么就来做些游戏吧 内附有源代码 清楚明了
  • 最厉害的代码

    千次阅读 2018-07-29 23:30:27
    1.侧滑和切换 package ... import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction;...import and...

    1.侧滑和切换

    package com.example.administrator.mnykt;
    
    import android.support.v4.app.Fragment;
    import android.support.v4.app.FragmentManager;
    import android.support.v4.app.FragmentTransaction;
    import android.support.v4.widget.DrawerLayout;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.Gravity;
    import android.view.View;
    import android.widget.FrameLayout;
    import android.widget.ImageView;
    import android.widget.RadioGroup;
    
    import com.example.administrator.fragment.Frag1;
    import com.example.administrator.fragment.Frag2;
    import com.example.administrator.fragment.Frag3;
    import com.example.administrator.fragment.Frag4;
    
    import java.util.ArrayList;
    
    public class MainActivity extends AppCompatActivity {
    
        private Frag1 frag1;
        private Frag2 frag2;
        private Frag3 frag3;
        private Frag4 frag4;
        private ArrayList<Fragment> list;
    
        private RadioGroup radio_group;
        private FrameLayout fram_layout;
        private FragmentManager manager;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            final DrawerLayout d1 = (DrawerLayout) findViewById(R.id.d1);
            ImageView iv1 = (ImageView) findViewById(R.id.iv1);
            ImageView iv2 = (ImageView) findViewById(R.id.iv2);
            fram_layout = (FrameLayout) findViewById(R.id.fram_layout);
            radio_group = (RadioGroup) findViewById(R.id.radio_group);
            iv1.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    d1.openDrawer(Gravity.LEFT);
                }
            });
            iv2.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    d1.closeDrawer(Gravity.LEFT);
                }
            });
    
           final Frag1 frag1 = new Frag1();
            final Frag2 frag2 = new Frag2();
            final Frag3 frag3 = new Frag3();
            final Frag4 frag4 = new Frag4();
    
            manager = getSupportFragmentManager();
            manager.beginTransaction().replace(R.id.fram_layout,frag1).commit();
    
            radio_group.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(RadioGroup group, int checkedId) {
                    FragmentTransaction transaction = manager.beginTransaction();
                    switch (checkedId){
                        case R.id.rb1:
                            transaction.replace(R.id.fram_layout,frag1);
                            break;
                        case R.id.rb2:
                            transaction.replace(R.id.fram_layout,frag2);
                            break;
                        case R.id.rb3:
                            transaction.replace(R.id.fram_layout,frag3);
                            break;
                        case R.id.rb4:
                            transaction.replace(R.id.fram_layout,frag4);
                            break;
                    }
                    transaction.commit();
                }
            });
        }
    }
    

    2.布局

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/d1"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity"
    
        >
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        >
        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:background="@color/colorPrimaryDark"
    
            >
            <ImageView
                android:id="@+id/iv1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:src="@mipmap/ic_launcher"
                />
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="主页面"
                android:layout_centerHorizontal="true"
                android:textSize="20sp"
                android:layout_marginTop="10dp"
                />
        </RelativeLayout>
        <FrameLayout
            android:id="@+id/fram_layout"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="8"
            />
        <RadioGroup
            android:id="@+id/radio_group"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:orientation="horizontal"
            >
            <RadioButton
                android:id="@+id/rb1"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:gravity="center"
                android:text="首页"
                android:button="@null"
                android:textSize="20sp"
                />
            <RadioButton
                android:id="@+id/rb2"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:gravity="center"
                android:text="关注"
                android:button="@null"
                android:textSize="20sp"
                />
            <RadioButton
                android:id="@+id/rb3"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:gravity="center"
                android:text="推荐"
                android:button="@null"
                android:textSize="20sp"
                />
            <RadioButton
                android:id="@+id/rb4"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:gravity="center"
                android:text="娱乐"
                android:button="@null"
                android:textSize="20sp"
                />
        </RadioGroup>
    </LinearLayout>
    
    <LinearLayout
        android:layout_width="350dp"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:background="@color/colorPrimary"
        >
        <ImageView
            android:id="@+id/iv2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@mipmap/ic_launcher"
            />
    </LinearLayout>
    
    
    </android.support.v4.widget.DrawerLayout>

    3.fragment页面

    package com.example.administrator.fragment;
    
    import android.os.Bundle;
    import android.support.annotation.NonNull;
    import android.support.annotation.Nullable;
    import android.support.v4.app.Fragment;
    import android.util.Log;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.ListView;
    import android.widget.Toast;
    
    import com.example.administrator.adapter.Adapter;
    import com.example.administrator.bean.NewsBean;
    import com.example.administrator.helper.NewsDao;
    import com.example.administrator.helper.User;
    import com.example.administrator.mnykt.R;
    import com.example.administrator.utils.HttpUtils;
    import com.example.administrator.utils.NetUtils;
    import com.google.gson.Gson;
    import com.handmark.pulltorefresh.library.PullToRefreshBase;
    import com.handmark.pulltorefresh.library.PullToRefreshListView;
    
    import java.util.ArrayList;
    import java.util.HashSet;
    
    public class Frag1 extends Fragment implements HttpUtils.Netcallback {
    
        private PullToRefreshListView pulltorefsh;
        private String url = "http://ttpc.dftoutiao.com/jsonpc/refresh?type=";
        //private String bannerUrl = "http://www.xieast.com/api/banner.php";
        private int type = 5010;
        private ArrayList<NewsBean.DataBean> list;
        private Adapter adapter;
        private NewsDao newsDao;
        private HttpUtils httpUtils;
    
        @Nullable
        @Override
        public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
            View view = View.inflate(getContext(), R.layout.frag1, null);
             pulltorefsh = view.findViewById(R.id.pulltorefsh);
             pulltorefsh.setMode(PullToRefreshBase.Mode.BOTH);
             pulltorefsh.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener2<ListView>() {
                 @Override
                 public void onPullDownToRefresh(PullToRefreshBase<ListView> refreshView) {
                     type=5010;
                     pulltorefsh.postDelayed(new Runnable() {
                         @Override
                         public void run() {
                             pulltorefsh.onRefreshComplete();
                         }
                     },2000);
                     getData();
                 }
    
                 @Override
                 public void onPullUpToRefresh(PullToRefreshBase<ListView> refreshView) {
                   type++;
                     pulltorefsh.postDelayed(new Runnable() {
                         @Override
                         public void run() {
                             pulltorefsh.onRefreshComplete();
                         }
                     },2000);
                   getData();
                 }
             });
            //创建一个空的结合
            list = new ArrayList<>();
            //创建适配器
            adapter = new Adapter(getActivity(), list);
            pulltorefsh.setAdapter(adapter);
            //创建dao层
            newsDao = new NewsDao(getActivity());
            httpUtils = HttpUtils.getInstance();
            getData();
    
            //网络工具类
            return view;
        }
    
    
    
        private void getData() {
            User user = newsDao.query(url + type);
            if (user!=null){
                parserjson(user.json);
            }else{
               if (NetUtils.iswlzj(getActivity())){
                   httpUtils.getwangluo(url+type,this);
               }else{
                   Toast.makeText(getActivity(), "请连接网络", Toast.LENGTH_SHORT).show();
               }
            }
        }
    
        private void parserjson(String json) {
            Gson gson = new Gson();
            NewsBean newsBean = gson.fromJson(json, NewsBean.class);
            if (type==5010){
                list.clear();
            }
            list.addAll(newsBean.getData());
            HashSet hashSet = new HashSet(list);
            list.clear();
            list.addAll(hashSet);
            adapter.notifyDataSetChanged();
        }
    
        @Override
        public void onSuccess(String result) {
            Log.i("aaa","执行了success");
            //截取字段
            String json = result.replace("null(", "").replace(")", "");
           //把数据添加到数据库
            newsDao.insert(new User((url+type),json));
            Gson gson = new Gson();
            NewsBean newsBean = gson.fromJson(json, NewsBean.class);
            list.addAll(newsBean.getData());
    
        }
    
        @Override
        public void onError(String s) {
          Log.i("aaa",s);
        }
    
    }
    

    4.适配器

    package com.example.administrator.adapter;
    
    import android.content.Context;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.BaseAdapter;
    import android.widget.ImageView;
    import android.widget.TextView;
    
    import com.example.administrator.bean.NewsBean;
    import com.example.administrator.mnykt.R;
    import com.nostra13.universalimageloader.core.ImageLoader;
    
    import java.util.ArrayList;
    
    public class Adapter extends BaseAdapter {
        private Context context;
        private ArrayList<NewsBean.DataBean> list;
    
        public Adapter(Context context, ArrayList<NewsBean.DataBean> list) {
            this.context = context;
            this.list = list;
        }
        private final int TYPE_0=0;
        private final int TYPE_1=1;
    
    
    
    
        @Override
        public int getCount() {
            return list.size();
        }
    
        @Override
        public Object getItem(int position) {
            try {
                return list.get(position);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }
    
        @Override
        public long getItemId(int position) {
            return 0;
        }
    
        @Override
        public int getViewTypeCount() {
            return 2;
        }
    
        @Override
        public int getItemViewType(int position) {
            int p=position%2;
            if (p==0){
                return TYPE_0;
            }else{
                return TYPE_1;
            }
        }
    
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            int type = getItemViewType(position);
            if (type==0){
                ViewHolder holder=null;
                if (convertView==null){
                    convertView = View.inflate(context, R.layout.item1, null);
                     holder = new ViewHolder();
                    holder.text_view = (TextView)convertView.findViewById(R.id.text_view);
                    holder.iv3 = (ImageView)convertView.findViewById(R.id.iv3);
                    convertView.setTag(holder);
                }else{
                    holder = (ViewHolder) convertView.getTag();
                }
                holder.text_view.setText(list.get(position).getBrief());
                ImageLoader.getInstance().displayImage(list.get(position).getMiniimg().get(0).getSrc(),holder.iv3);
                return convertView;
            }else if (type==1){
                ViewHolder holder=null;
                if (convertView==null){
                    convertView = View.inflate(context, R.layout.item2, null);
                    holder = new ViewHolder();
                    holder.text_view1 = (TextView)convertView.findViewById(R.id.text_view1);
                    holder.iv4 = (ImageView)convertView.findViewById(R.id.iv4);
                    holder.iv5 = (ImageView)convertView.findViewById(R.id.iv5);
                    holder.iv6 = (ImageView)convertView.findViewById(R.id.iv6);
                    convertView.setTag(holder);
                }else{
                    holder = (ViewHolder) convertView.getTag();
                }
                holder.text_view1.setText(list.get(position).getBrief());
                ImageLoader.getInstance().displayImage(list.get(position).getMiniimg().get(0).getSrc(),holder.iv4);
                ImageLoader.getInstance().displayImage(list.get(position).getMiniimg().get(0).getSrc(),holder.iv5);
                ImageLoader.getInstance().displayImage(list.get(position).getMiniimg().get(0).getSrc(),holder.iv6);
                return convertView;
            }
            return null;
        }
        public class ViewHolder{
    
            public TextView text_view;
            public ImageView iv3;
            public TextView text_view1;
            public ImageView iv4;
            public ImageView iv5;
            public ImageView iv6;
        }
    }
    
    展开全文
  • 代码大全(第二版)

    2020-07-29 14:18:17
    学习各种编码技巧,全面提高编码能力的必备书籍,经典中的经典
  • Java学习代码合集

    万次阅读 多人点赞 2019-07-17 10:49:41
    其实我学习java最根本的原因是:我是一个挺关注外在的人,虽然是个程序员,所以我很喜欢写出那些带有漂亮的界面的程序,因为C总是控制台,我不是很喜欢,在这份java代码合集中,我会记录自己学习Java界面化编程的...

    其实我学习java最根本的原因是:我是一个挺关注外在的人,虽然是个程序员,所以我很喜欢写出那些带有漂亮的界面的程序,因为C总是控制台,我不是很喜欢,在这份java代码合集中,我会记录自己学习Java界面化编程的点点滴滴。

    更新:因为C/C++是我主要使用语言,所有后来写界面主要用Qt写了,但我java也会继续学的。我只是给想学界面gui的同志一个思路。可以参考这篇文章Qt5 计算器的实现

    可能会有java初学者,我也是,说明,java是一个工程里可以有很多java类class,每一个类class都可以单独运行,不像C语言里只能有一个main()函数可以运行,这是我的代码合集程序结构:

    helloworld:

    class Javahelloworld {
        public static void main(String args[]){
            System.out.println("hello world\n");
        }
    }
    

    基本输入输出:

    import java.util.Scanner;
    public class ScannerTest {
        public static void main(String[] args){
            Scanner scanner=new Scanner(System.in);
            System.out.print("请输入一个数");
            int a=scanner.nextInt();
            System.out.printf("%d的平方是%d\n",a,a*a);
        }
    }
    

    Java图形化界面求数的平方:

    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;/**包含JFrame*/
    public class AppGraphInOut {
        public static  void main(String args[]){
            new AppFrame();
        }
    }
    
    class AppFrame extends  JFrame
    {
        JTextField in=new JTextField(10);
        JButton btn=new JButton("求平方");
        JLabel out=new JLabel("用于显示平方结果的标签");
        public AppFrame()
        {
            setLayout(new FlowLayout());
            getContentPane().add(in);
            getContentPane().add(btn);
            getContentPane().add(out);
            btn.addActionListener(new BtnActionAdapter());
            setSize(400,100);
            setDefaultCloseOperation(DISPOSE_ON_CLOSE);
            setVisible(true);
        }
    
        class BtnActionAdapter implements ActionListener
        {
            public void actionPerformed(ActionEvent e)
            {
                String s=in.getText();
                double d=Double.parseDouble(s);
                double sq=d*d;
                out.setText(d+"的平方是:"+sq);
            }
        }
    }
    

    Java位运算:

    public class BitwiseOperators {
        public static  void main(String args[]){
            int a=0b1100;
            int b=0b1010;
            print("a    ",a);
            print("b    ",b);
            print("a&b  ",a&b);
            print("a|b  ",a|b);
            print("a^b  ",a^b);
            print("~a   ",~a);
            print("a<<2 ",a<<2);
            print("a>>2 ",a>>2);
            print("a>>>2    ",a>>>2);
        }
        static void print(String prefix,int n){
            String s=Integer.toBinaryString(n);
            while(s.length()<4)s="0"+s;
            System.out.print(prefix+" "+s+"\n");
        }
    }
    

    同心圆:

    import java.awt.*;
    import javax.swing.*;
    
    public class Circle99Frame extends JFrame {
        public static void main(String args[])
        {
            JFrame frame=new Circle99Frame();
            frame.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
            frame.setSize(600,600);
            frame.setVisible(true);
        }
        public void paint(  Graphics g)
        {
            g.drawString("circle 99",20,20);
            int x0=getSize().width/2;
            int y0=getSize().height/2;
            for(int r=0;r<getSize().height/2;r+=10)
            {
                g.setColor(getRandomColor());
                g.drawOval(x0-r,y0-r,r*2,r*2);
            }
        }
        Color getRandomColor()
        {
            return new Color(
                    (int)(Math.random()*255),//random本身只产生(0~1)之间的小数,
                    (int)(Math.random()*255),
                    (int)(Math.random()*255)
            );
        }
    }
    

     

    下面呢是一个常见的简陋的登陆界面,这个程序是这个两个类class共同组成的程序,先看代码:

    
    import javax.swing.JFrame;
    
    import javax.swing.JPanel;
    
    public class DemoFrame extends JFrame{
    
        public DemoFrame(DemoPanel panel)
    
        {
    
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
            this.setSize(300, 200);
    
            this.setTitle("Frame Demo");
    
            this.add(panel);
    
            this.setResizable(false);
    
            this.setVisible(true);
    
        }
    
    
    
        public static void main(String[] args)
    
        {
    
            DemoPanel panel = new DemoPanel();
    
            DemoFrame Frame = new DemoFrame(panel);
    
        }
    
    }  
    import java.awt.GridLayout;
    
    
    
    import javax.swing.JButton;
    
    import javax.swing.JLabel;
    
    import javax.swing.JPanel;
    
    import javax.swing.JPasswordField;
    
    import javax.swing.JTextField;
    
    
    
    public class DemoPanel extends JPanel{
    
    
    
        private JLabel labelUser, labelPassWd;            //标签      用户名,密码
    
        private JButton buttonLogin, buttonReset;         //按钮      登录,重置
    
        private JTextField textFieldUserName;             //文本框  用户名输入
    
        private JPasswordField passWdField;               //密码框  密码输入
    
        private JPanel panelUserName;
    
        private JPanel panelPassWd;
    
        private JPanel panelLoginButton;
    
    
    
        public DemoPanel(){
    
            this.labelUser = new JLabel("用户名");
    
            this.labelPassWd = new JLabel("密    码");
    
            this.buttonLogin = new JButton("登录");
    
            this.buttonReset = new JButton("重置");
    
            this.textFieldUserName = new JTextField(10);
    
            this.passWdField = new JPasswordField(10);
    
            this.panelPassWd = new JPanel();
    
            this.panelUserName = new JPanel();
    
            this.panelLoginButton = new JPanel();
    
    
    
            this.setLayout(new GridLayout(3, 1));  //网格式布局
    
    
    
            this.panelUserName.add(this.labelUser);
    
            this.panelUserName.add(this.textFieldUserName);
    
            this.panelPassWd.add(this.labelPassWd);
    
            this.panelPassWd.add(this.passWdField);
    
            this.panelLoginButton.add(buttonLogin);
    
            this.panelLoginButton.add(buttonReset);
    
    
    
            this.add(this.panelUserName);
    
            this.add(this.panelPassWd);
    
            this.add(this.panelLoginButton);
    
        }
    
    }

    程序结果如下 :

    简单的加法器:

    package TEST;
    
    
    
    import javax.swing.JOptionPane;  //导入类
    
    
    
    public class TEST
    
    {
    
        public static void main(String args[])
    
        {
    
            String input_pane1,input_pane2;
    
            int n1,n2,sum;
    
            input_pane1 = JOptionPane.showInputDialog("Please input the first number");  //输入框1
    
            input_pane2 = JOptionPane.showInputDialog("Please input the second number"); //输入框2
    
            n1 = Integer.parseInt(input_pane1); //获取输入框中输入数据的整数类型
    
            n2 = Integer.parseInt(input_pane2);//获取输入框中输入数据的整数类型
    
            sum = n1+n2;
    
            JOptionPane.showMessageDialog(null, "The sum is: "+sum,"Adding Device",JOptionPane.PLAIN_MESSAGE);
    
            //第1个参数:null 显示在中央
    
            //第2个参数:要显示的字符
    
            //第3个参数:标题栏信息
    
            //第4个参数:对话框类型
    
            System.exit(0);  //终结图形用户界面程序必须的
    
        }
    
    }

    结果如下:

    说到这里,我其实有些感触,记得上学期,我们做课程设计,当时一个同学的题目是写一个带界面的大数乘除运算器,关于大数乘除的方法,我有时间再总结一下,但是这个界面当时同学其实是不会的,但是现在看,如果单纯实现界面还是比较简单的,首先看我修改的第一个拙劣的界面版本模板:

    这样其实就好了很多,起码可以看到加数是哪些了,代码很简单,只需要在输出那行添加上n1和n2的信息就可以了。

    JOptionPane.showMessageDialog(null, n1+"+"+n2+" The sum is: "+sum,"Adding Device",JOptionPane.PLAIN_MESSAGE);
    

     

    展开全文
  • 代码重构(一)

    千次阅读 2019-04-08 18:49:44
    代码重构 代码坏味 1.1重复代码(Duplicated Code) 出现的情况: 相同的代码结构重复出现不同地方时,我们可以将它们合而为一。 两个互为新工地的子类内包含相同的表达式 具体采用的方法: 采用Extract Method...

    代码重构

    1. 代码坏味

    1.1重复代码(Duplicated Code)

    出现的情况:

    1. 相同的代码结构重复出现不同地方时,我们可以将它们合而为一。
    2. 两个互为新工地的子类内包含相同的表达式

    具体采用的方法:

    1. 采用Extract Method提炼重复代码
    2. 只需对两个类都是用Extract Method,然后再对被提炼出来的代码使用Pull Up Method将它推入超类内
    3. 如果两个毫不相关的类出现重复代码,可以考虑使用Extract Class将重复代码提炼到一个独立类中,然后在另一个类内使用这个新类。

     

    1.2 Long Method(过长函数)

    1.采用Extract Method把函数变小

    2.如果函数内有大量的参数和临时变量,经常可以运用Replace Temp with Query来消除这些临时元素。Introduce Parameter Object 和 Preserve Whole Object 则可以将过长的参数列表变得更简洁。如果仍然有太多临时变量和参数,那就应该使出杀手锏:Replace Method with Method Object。

     

    1.3 Large Class(过大的类)

    1.可以使用Extract Class将几个变量一起提炼至新类内,提炼时应该选择类内彼此相关的变量将它们放在一起。如果这个组件适合作为一个子类,也可以使用Extract Subclass。

     

    1.4 Long Parameter List(过长参数列)

    1.如果向已有的对象发出一条请求就可以取代一个参数,那么你应使用Replace Parameter wiht Method。

     

    1.5 Divergent Change(发散式变化)

    特点:如果某个类经常因为不同的原因在不同的方向上发生变化,当需要修改代码时,我们希望能够跳到系统的某一点,只在该处做修改。(一个类受多种变化的影响)

    1.针对某一外界变化的所有修改,都至应该发生在单一类中,而这个新类内的所有内容都应该反应此变化。可以运用Extract Class将他们提炼到另一个类中。

     

    1.6 Shotgun Surgery (散弹式修改)

    该方法和Divergent change类似但是相反。如果每遇到某种变化,你都必须在许多不同的类内做出许多小修改,此即为Shotgun Surgery。(一种变化引起多个类响应修改)

    重构方法:可以使用Move Method 和 Move Field把所有需要修改的代码放进同一个类内。如果没有何时的类可以放置这些代码,可以新建一个。通常使用Inline Class 把一系列相关行为放进同一个类。

    1.7 Feature Envy(依恋清洁)

    官方的:函数对某个类的兴趣高过对自己所处类的兴趣。

    影响:数据和行为不在一处,修改不可控。

    目标:将数据和操作数据的行为包装在一起。

     

    1.8 Data Clumps(数据泥团)

    数据项(data items)就像小孩子:喜欢成群结队地待在一块儿。你常常可以在很多地方看到相同的三或四笔数据项:两个classes内的相同值域(field)、许多函数签名式(signature)中的相同参数。这些「总是绑在一起出现的数据」真应该放进属于它们自己的对象中。首先请找出这些数据的值域形式(field)出现点,运用Extract Class (提炼类)将它们提炼到一个独立对象中。然后将注意力转移到函数签名式(signature)上头,运用Introduce Parameter Object(引入参数对象) 或Preserve Whole Object(保持对象完整) 为它减肥。这么做的直接好处是可以将很多参数列缩短,简化函数调用动作。是的,不必因为Data Clumps只用上新对象的一部分值域而在意,只要你以新对象取代两个(或更多)值域,你就值回票价了。

     

    一个好的评断办法是:删掉众多数据中的一笔。其他数据有没有因而失去意义?如果它们不再有意义,这就是个明确信号:你应该为它们产生一个新对象。

     

    缩短值域个数和参数个数,当然可以去除一些坏味道,但更重要的是:一旦拥有新对象,你就有机会让程序散发出一种芳香。得到新对象后,你就可以着手寻找Feature Envy,这可以帮你指出「可移至新class」中的种种程序行为。不必太久, 所有classes都将在它们的小小社会中充分发挥自己的生产力。

     

    1.9 Primitive Obsession(基本类型偏执)

    定义:Coding的时候总喜欢用基本类型,而不喜欢用对象。

    影响:增加扩展和修改的复杂性。

     

    1.10 Switch Statements(Switch 惊悚现身)

    面向对象程序的一个最明显特征就是:

    少用switch(或case)语句.
    

    从本质上说,switch语句的问题在于重复. 你会发现同样的switch语句散布于不同地点.如果要为它添加一个新的case子句,就必须找到所有并修改它们,面向对象的多态概念可为此带来优雅的解决方案.

    大多数时候,一看到swith语句,你就应该考虑以多态来替换它. 问题是多态该出现在哪里?Switch语句常常根据类型码进行选择,你要的是

    "与该类型码相关的函数或类"
    

    所以应该使用Extract Method将switch语句提炼到一个独立函数中,再以Move Method 将它们搬移到需要多态性的那个类里. 此时你必须决定是否使用Replace Type Code with Subclasses(用子类取代类型码)或者Replace Type Code With State/Strategy(用state或Strategy替代类型码) . 一旦这样完成继承结构之后, 你就可以运用Replace wonditional with
    Polymorphism(用多态取代条件表达式)

    如果你只是在单一函数中有些选择事例, 且并不想改动它们,那么多态就有点杀鸡用牛刀了. 这种情况下Replace Parameter with Explicit Methods(以明确函数取代参数)是个不错的选择. 如果你的选择条件之一是null, 可以试试Introduce Null Object(引入Null对象).


    tips

    Replace Type Code with Subclasses(用子类取代类型码)

    如果你面对的类型码不会影响宿主类的行为,
    可以使用Replace Type Code with Class来处理它们.
     
    但如果类型码会影响宿主类的行为,
    那么最好的办法就是借助多态来处理变化行为.

    1.11 Parallel Inheritance Hierarchies (平行继承体系)

    含义:
        每当为一个类增加子类时,必须也为另一个类相应增加子类。
    坏处:
        重复的类
    目标:
        让其中一个继承体系的实例引用另一个继承体系的实例,减少平行继承的类。
    实现方法:
        让其中一个继承体系的实例引用另一个继承体系的实例
    使用Move Method (搬移函数) 和**Move Field(搬移字段)**消除引用,最终这些平行继承的类。
     

     

     

     

     

    1. 名词注释
    1. Duplicated Code                 重复代码
    2. Extract Method                   提取方法
    3. Pull Up Method                    方法上移
    4. Template Method                 模板设计模式                    
    5. Extract Class 提取类
    6. Extract Subclass 提取子类
    7. Long Method 过长函数
    8. Inline Temp 内联临时变量
    9. Replace Temp with Query      用查询来替换临时变量本身
    10. Introduce Parameter Object 引入参数对象
    11. Data Clumps 数据泥团
    12. Preserve Whole Object 保持对象完整
    13. Move Method 搬移函数
    14. Replace Method with Method Object    用方法对象代替方法
    15. Decompose Conditional 分解条件表达式
    16. Replace Nested Conditional with Guard Clauses   以卫语句取代嵌套条件表达式
    17. Replace Parameter with Methods 以函数取代参数

     

    展开全文
  • 什么是代码区、常量区、静态区(全局区)、堆区、栈区? 一直对这些区搞不清楚,每次听到这些区头都大了,感觉很混乱。下面就结合STM32内核来具体讨论分析这些区到底是什么回事,每种关键字定义的变量又到底是存在...

    什么是代码区、常量区、静态区(全局区)、堆区、栈区?

    一直对这些区搞不清楚,每次听到这些区头都大了,感觉很混乱。下面就结合STM32内核来具体讨论分析这些区到底是什么回事,每种关键字定义的变量又到底是存在什么区。
    如下图,是自己总结的内存分区的示意图。一般内存主要分为:代码区、常量区、静态区(全局区)、堆区、栈区这几个区域。
    这里写图片描述
    代码区:存放程序的代码,即CPU执行的机器指令,并且是只读的。
    常量区:存放常量(程序在运行的期间不能够被改变的量,例如: 10,字符串常量”abcde”, 数组的名字等)
    静态区(全局区):静态变量和全局变量的存储区域是一起的,一旦静态区的内存被分配, 静态区的内存直到程序全部结束之后才会被释放
    堆区:由程序员调用malloc()函数来主动申请的,需使用free()函数来释放内存,若申请了堆区内存,之后忘记释放内存,很容易造成内存泄漏
    栈区:存放函数内的局部变量,形参和函数返回值。栈区之中的数据的作用范围过了之后,系统就会回收自动管理栈区的内存(分配内存 , 回收内存),不需要开发人员来手动管理。栈区就像是一家客栈,里面有很多房间,客人来了之后自动分配房间,房间里的客人可以变动,是一种动态的数据变动。
    下面结合STM32内核和代码实际测试各关键字存储的区域和特点。
    本文使用是STM32L152芯片,keil V5环境下默认的内存配置见下图:
    这里写图片描述
    默认分配的ROM区域是0x8000000开始,大小是0x20000的一片区域,那么这篇区域是只读区域,不可修改,也就是存放的代码区和常量区。
    默认分配的RAM区域是0x20000000开始,大小是0x4000的一片区域,这篇区域是可读写区域,存放的是静态区、栈区和堆区。该芯片的内部分区如下图所示:
    这里写图片描述

    基于STM32内核的代码测试

    下面进行详细的测试,查看各关键字所在的各分区。

    代码区

    • 代码区的内存是由系统控制的
    • 代码区的存放 :程序中的函数编译后cpu指令
    • 代码区的地址:函数的地址,程序的入口地址,程序的名字
      函数的名称也是一个指针,可以通过查询函数名称所处的内存地址,查询函数存放的区域。
    void test(void)
    {
        printf("main:0x%p\n",main);//打印main函数的存放地址
    }

    这里写图片描述可以看到main函数确实存放在0x08002e81这片地址区域,在代码区中。

    常量区

    下面来分析一句代码:
    char *p = “abcdef”;
    这句代码和char *p; p= “abcdef”;是等价的。
    上面的两种定义方式的具体意思是:定义一个char * 型的指针p,p存放的是字符串常量”abcdef”的首地址,字符串常量”abcdef”是存放在常量区的,也就是p是指向常量区的。那么p指向的区域里面的内容是不可以得修改,只可以 *p来读取p指向的内容,当然也可以把指针p移走,指向其他区域。
    测试如下:

    void test(void)
    {   
        char *p="abcdef";
        printf("0x%p: %s\n", p , p);//打印指针p的地址和p指向的字符串内容
        p="qwedma";
        printf("0x%p: %s\n", p , p);//打印指针p的地址和p指向的字符串内容
        p[0]='1';                     //尝试把p指向的第一个字符q修改为1
        printf("0x%p: %s\n", p , p);//打印指针p的地址和p指向的字符串内容
    }

    这里写图片描述可以看到,abcdef字符串常量存放在0x08002ecc区域,p指针指向该区域,并把p指针移走指向qwedma字符串常量的首地址0x08002ee0。当尝试修改p指向的第一个字符,即把qwedma修改为1wedma,发现打印出来的内容并未改变,常量区的内容不可以改变。

    继续看这句 char str[] = “abcd”;这句话是定义了一个字符数组,但是这个str数组是存放在栈区的,然后再把字符串常量”abcd”拷贝到栈区的str数组内,那么此时的str是可以修改的。

    void test(void)
    {
        char str[] = "abcd";
        printf("0x%p: %s\n", str , str);
        str[0]='e';
        printf("0x%p: %s\n", str , str);
    }

    这里写图片描述 可以看到str是指向栈区的地址:0x200007c0,且指向的内容可以被修改,第一个字符a被修改为e。

    静态区(全局区)

    static int a;
    int c;
    void test(void)
    {
        static int b=1;
        b++;
        printf("b:0x%p: %d\n", &b , b);
    }
    int main()
    {
        printf("a: 0x%p: %d\n", &a , a);
        printf("c: 0x%p: %d\n", &c , c);
        for(uint8_t i=0;i<5;i++)
        {
            test();
        }
        return 0;
    }

    这里写图片描述a是静态全局变量,b静态局部变量,c是全局变量,它们都存放在静态区;a和c并未初始化,打印出来都是0,说明编译器自动把他们初始化为0;b在for循环中初始化5次,但实际效果是b仅初始化一次,后面每次调用b都是上次的值,且b的地址一直是不变的,编译器只会为第一次初始化的b分配内存,后面4次初始化是无效的。

    堆区

    堆区是调用malloc函数来申请内存空间,这部分空间使用完后需要调用free()函数来释放。
    void * mallc(size_t);函数的输入是分配的字节大小,返回是一个void*型的指针,该指针指向分配空间的首地址,void *型指针可以任意转换为其他类型的指针。

    void test(void)
    {   
        int *p1=malloc(4);//申请4字节的空间
        *p1=123;// 该空间赋值123
        printf("0x%p:%d\n",p1,*p1);
        printf("0x%p\n",&p1);
        free(p1);
        printf("0x%p:%d\n",p1,*p1);
        p1 = NULL;
        printf("0x%p\n",p1);
    }

    这里写图片描述
    int *p1=malloc(4);语句是申请了4个字节的空间,空间的首地址赋给指针p1,可以看到这个首地址是0x200003e8,存在是堆区;
    printf(“0x%p\n”,&p1);指针p1本身也是需要存放的,p1本身是存放在栈区的0x200009d0;
    free(p1);内存释放函数 free(开辟的内存的首地址) ,将内存标记为可用且将里面的内容清空为0,但指针p1还是指向这片空间。比较安全的做法是p1 = NULL;把p1指针释放,避免造成野指针。

    void test(void)
    {   
        int *p1=malloc(4);
        int *p2=malloc(4);
        printf("p1:0x%p\n",p1);
        printf("p2:0x%p\n",p2);
    }

    这里写图片描述p2的地址是大于p1的地址,验证堆区是向上生长的,后申请的空间地址会依次增加。

    栈区

    栈区由编译器自动分配释放,存放函数的参数值、返回值和局部变量,在程序运行过程中实时分配和释放,栈区由操作系统自动管理,无须手动管理。栈区是先进后出原则,即先进去的被堵在屋里的最里面,后进去的在门口,释放的时候门口的先出去。

    void test(void)
    {   
        int a;
        int b=0;    
        printf("a:0x%p:%d\n",&a,a);
        printf("b:0x%p:%d\n",&b,b);
    }

    这里写图片描述
    可以看到后定义的局部变量b地址是比a小的,即栈区是向下生长的;
    a变量没有进行初始化,打印出的a是垃圾值,编译器不会把局部变量初始化为0。但是,需要注意:如果你运行于debug调试模式,运行时机制会把你的栈空间全部初始化为0,这就是解释了为什么平时在debug时看到的未初始化的局部变量初始值是0.
    使用局部变量时,尽量要先进行初始化,避免垃圾值造成错乱。

    大小端测试

    数据在内存中存放,有大段模式和小端模式。
    小端模式(little-endian):低位字节存在低地址上,高位字节存在高地址上;
    大端模式( big-endian):低位字节存在高地址上,高位字节存在低地址上,刚好与小端模式相反。
    另:网络字节序:TCP/IP各层协议将字节序定义为Big-Endian,因此TCP/IP协议中使用的字节序通常称之为网络字节序

    static uint32_t m=0x87654321;
    char *p=(char*)&m;
    void test(void)
    {   
        printf("P  :0x%p: %x\n",p,*p);
        printf("P+1:0x%p: %x\n",p+1,*(p+1));
        printf("P+2:0x%p: %x\n",p+2,*(p+2));
        printf("P+3:0x%p: %x\n",p+3,*(p+3));
    }

    这里写图片描述低字节21放在低地址,高字节87放在高地址,与小端模式相符。

    keil中代码和数据量所占字节的查询

    keil软件勾选上生成批处理文件,在keil编译完成后,可以查看到代码和定义的数据所占的字节大小。

    这里写图片描述这里写图片描述
    如上图,Code是程序代码所占的字节,即代码区;
    RO-data 代表只读数据,程序中所定义的常量数据和字符串等都位于此处,即常量区;
    RW-data 代表已初始化的读写数据,程序中定义并且初始化的全局变量和静态变量位于此处,一部分静态区(全局区);
    ZI-data 代表未初始化的读写数据,程序中定义了但没有初始化的全局变量和静态变量位于此处,另一部分的静态区(全局区)。ZI英语是zero initial,就是程序中用到的变量并且被系统初始化为0的变量的字节数,keil编译器默认是把你没有初始化的变量都赋值一个0,这些变量在程序运行时是保存在RAM中的。
    Total ROM Size (Code + RO Data + RW Data)这样所写的程序占用的ROM的字节总数,也就是说程序所下载到ROM flash 中的大小。

    为什么Rom中还要存RW,因为掉电后RAM中所有数据都丢失了,每次上电RAM中的数据是被重新赋值的,每次这些固定的值就是存储在Rom中的,为什么不包含ZI段呢,是因为ZI数据都是0,没必要包含,只要程序运行之前将ZI数据所在的区域一律清零即可,包含进去反而浪费存储空间。

    实际上,ROM中的指令至少应该有这样的功能:
    1. 将RW从ROM中搬到RAM中,因为RW是变量,变量不能存在ROM中。
    2. 将ZI所在的RAM区域全部清零,因为ZI区域并不在Image中,所以需要程序根据编译器给出的ZI地址及大小来将相应得RAM区域清零。ZI中也是变量,同理:变量不能存在ROM中。
    在程序运行的最初阶段,RO中的指令完成了这两项工作后C程序才能正常访问变量。否则只能运行不含变量的代码。

    展开全文
  • 代码编写规范

    千次阅读 2019-04-23 22:48:44
    排版格式2.1 类及其排版格式2.2 函数的声明与定义2.3 空行2.4 代码行2.5 代码行内的空格2.6 对齐2.7 长行拆分2.8 修饰符的位置2.9 代码段中的预处理格式2.10 被注释的代码2.11 注释3.命名规则4.表达式和基本语句4.1 ...
  • 常见HTTP错误代码大全

    万次阅读 多人点赞 2011-06-24 15:10:00
    一些常见的状态码为:200 - 服务器成功返回网页404 - 请求的网页不存在503 - 服务不可用详细分解:1xx(临时响应)表示临时响应并需要请求者继续执行操作的状态代码代码 说明100 (继续) 请求者应当继续提出请求...
  • 即使是一段普通的代码,在保持思维清晰、功能友好的前提下怎样编写才能结构清晰、整洁美观呢? 在多年以前,人们注重功能是如何实现的。现如今,随着Web及互联网技术的不断发展,功能仅成了最基本的要求,...
  • ©的代码实现

    千次阅读 2017-03-16 14:15:14
  • HTML网页特殊符号代码大全 ...下面做了整理,以备速查(注意:代码对大小写敏感)。 1、特色类 字符 实体名称 实体数字 描述 © &copy; &#169; 版权标志 | 竖线,常用作菜单或导航中的分隔符
  • cmd版贪吃蛇

    万次阅读 2018-03-28 00:23:20
    import java.awt.*; import java.util.LinkedList; import java.util.Scanner; /** * @author aachen0 * @date 2018/3/27 13:56 * IDE:IntelliJ IDEA ...public class SnakeGame { static final int WIDTH = ...
  • 代码装逼大全

    万次阅读 2016-11-04 15:29:05
    对于循环 for(int i=0;i 改成 for(int i=0,e=list.size();i for里可以用赋值表达式。
  • Emoji表情代码大全

    万次阅读 2018-01-31 15:13:22
    Emoji表情代码大全
  • 代码重构无处不在,重点滴做起。经常见到一些下面这样的代码: 1、不要拿bool和false直接比 if (false == IsXXX()) { } 这是画蛇添足,费力不会讨好,直接了当即可:if (!IsXXX()) 2、太多的...
  • Android Studio 统计项目的代码总行数

    万次阅读 多人点赞 2016-04-04 16:28:27
    开发中常常会想看看自己累积在这个项目中写了多少代码了,以下就是在Android Studio查看统计项目代码总行数的方法。 打开Android Studio,按快捷键Ctrl+Shift+A 输入find 选择Find in Path,双击 在弹出的对话框...
  • word或wps中如何插入代码

    万次阅读 2014-05-14 11:07:17
    个工具------Notepad++,它具备一般文本的功能,且具备编写代码的功能。包括代码排版,高亮显示,添加和删除注释等。 在 语言->J->Java可以编写java代码。 怎么使用于word和wps ? 在编写完成后,点击 插件->...
  • pycharm中代码补全,代码提示功能

    万次阅读 2017-12-12 17:50:34
    那什么,,,,,,是这样的,请先确保你的代码补全功能是打开的。打开操作方式是:file---->power save mode,把这个前面的√号去掉即可。 然后,代码在提示的时候,多打几个字,发现你想要的已经在最上面的时候...
  • SourceCount代码统计工具使用

    万次阅读 多人点赞 2018-05-24 11:01:50
    一个项目做完以后一般都会将代码的行数统计一下,这样可以和时间对比可以看出程序员的效率问题, 很多的公司都会做这件事,当然我本人是排斥的,毕竟一个项目的难易程度很大程度上不是代码量决定的,而是技术决定的...
1 2 3 4 5 ... 20
收藏数 11,901,139
精华内容 4,760,455
关键字:

代码